Hallo ,
kann mir hier irgendjemand sagen wie ich aus einer Datenbank nur jede 2. Zeile auslesen kann? Ich hab echt viel im Internet gesucht dazu aber leider nichts gefunden.
Nur jede 2. Zeile aus Postgre Datenbank auslesen?
@Hypec: was meinst Du mit "jede zweite Zeile"? Da die Einträge in einer Datenbanktabelle ungeordnet sind, ergibt diese Angabe keinen Sinn. Wie sieht die Tabelle aus, nach welchem Kriterium möchtest Du Einträge auswählen?
Also es kommt Jede stunde eine neue Zeile hinzu also sie sind schon geordnet. Ich will jetzt wenn z.B. die Werte aus einem Zeitraum von einer Woche abgefragt werden das dann nur noch jeder 2 oder 6 Wert angezeigt wird da es sonst zu viele Wären.
Das geht wahrscheinlich auch mit einer entsprechenden Abfrage, aber was hindert dich daran, alles Ergebnisse in eine Liste zu packen, und dir davon dann nur jedes 2te oder Te Element per slicing rauszuholen? Das bisschen Daten unnötig abfragen bringt niemandem ins schwitzen.
- pillmuncher
- User
- Beiträge: 1488
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Nein, das sind sie nicht. Du verwechselst den Allerweltsbegriff einer Tabelle (ein rechteckiges Feld mit Zeilen und Spalten, und in der ersten Zeile stehen die Spaltennamen) mit einer technischen Konkretisierung eines Elements der Relationalen Algebra, die nur zur Veranschaulichung denselben Namen Tabelle trägt. Postgres kann die Daten in dieser "Tabelle" speichern, wie es Postgres gefällt, und das muss nicht "von oben nach unten" sein. Postgres kann die Daten auch beliebig umspeichern, wenn das aus irgendeinem Grund will. Wenn du eine Sortieung möchtest, musst du sie selbst definieren, zB. über eine ORDER BY my_super_special_date_field oder so, und wenn du davon nur jeden zweiten Datensatz ausgeben möchtest. dann tu das einfach, indem du nur jeden zweiten anzeigst.
In specifications, Murphy's Law supersedes Ohm's.
Wenn Du nur jeden "zweiten" Eintrag willst, mußt die die Uhrzeit filtern, ob die Stunde gerade oder ungerade ist. Dazu gibt es in SQL Funktionen, die diese Berechnung durchführen können: https://www.postgresql.org/docs/9.1/fun ... ME-EXTRACT
Um meine erste Antwort mal etwas detailierter auszuführen:
Code: Alles auswählen
postgres=# create table timeseries (timestamp timestamp, value int);
CREATE TABLE
postgres=# insert into timeseries select *, random() from generate_series('2018-01-01 00:00'::timestamp, '2018-12-12 23:59', '1 hour');
INSERT 0 8304
postgres=# select timestamp, value from (select timestamp, value, row_number() over () as row from timeseries order by timestamp) as t where t.row % 2 = 0 limit 10;
timestamp | value
---------------------+-------
2018-01-01 01:00:00 | 1
2018-01-01 03:00:00 | 1
2018-01-01 05:00:00 | 1
2018-01-01 07:00:00 | 1
2018-01-01 09:00:00 | 1
2018-01-01 11:00:00 | 0
2018-01-01 13:00:00 | 1
2018-01-01 15:00:00 | 0
2018-01-01 17:00:00 | 0
2018-01-01 19:00:00 | 1
(10 rows)
[klugscheißmodus]Die Datenbank heißt PogreSQL oder Postgres[/klugscheißmodus]
Ich könnte mir vorstellen, dass man gar nicht jede x. Zeile anzeigen möchte. Wenn man die Ansicht vereinfachen möchte, indem man weniger Datenpunkte hat, geht man in der Regel doch so vor, dass man aus den bestehenden Daten entsprechende Mittelwerte bildet.
@Hypec vielleicht solltest du hie lesen: https://www.postgresql.org/docs/9.4/tutorial-agg.html
Ich könnte mir vorstellen, dass man gar nicht jede x. Zeile anzeigen möchte. Wenn man die Ansicht vereinfachen möchte, indem man weniger Datenpunkte hat, geht man in der Regel doch so vor, dass man aus den bestehenden Daten entsprechende Mittelwerte bildet.
@Hypec vielleicht solltest du hie lesen: https://www.postgresql.org/docs/9.4/tutorial-agg.html
@jerch: das Beispiel hat schon DasIch gebracht, wobei man hier sieht, das das nicht so einfach ist mit row_number, weil es nicht direkt in einer WHERE-Klausel vorkommen darf, und man daher ein Subselect braucht und noch eine Sortierung angeben muß, weil Einträge in einer Tabelle keine Ordnung haben.