Nur jede 2. Zeile aus Postgre Datenbank auslesen?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

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.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hypec hat geschrieben: Dienstag 11. Dezember 2018, 21:43Also es kommt Jede stunde eine neue Zeile hinzu also sie sind schon geordnet.
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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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)
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

[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
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Postgres hat eine Funktion `row_number`, damit bekommst Du eine fortlaufende Nummer, nach welcher Du in der WHERE Klausel filtern kannst (z.B. mit modulo).
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sirius3
Sorry hat ich übersehen. Gut das Du nochmal drauf hingewiesen hast.
Antworten