Code:select * from ( select user_id, rounds, duration, row_number() over (partition by user_id order by rounds DESC, duration ASC, user_id ASC) as rn from hs ) t where rn = 1
Hallo,
ich habe folgende Tabelle mit folgenden Daten:
Nun möchte ich das ganze nach round DESC, duration ASC, user_id ASC sortieren.Code:CREATE TABLE hs( user_id integer NOT NULL, rounds integer NOT NULL, duration integer NOT NULL, CONSTRAINT pkey PRIMARY KEY (user_id, rounds, duration) ); INSERT INTO hs (user_id, rounds, duration) VALUES (1, 4, 2000); INSERT INTO hs (user_id, rounds, duration) VALUES (2, 4, 2200); INSERT INTO hs (user_id, rounds, duration) VALUES (1, 5, 2100); INSERT INTO hs (user_id, rounds, duration) VALUES (3, 6, 2500); INSERT INTO hs (user_id, rounds, duration) VALUES (1, 5, 210);
Und nun brauche ich immer den ersten Eintrag pro Pro Benutzer, da ja jeder Benutzer ja nur mit seinem besten Eintrag ins Ranking übernommen werden soll.
Code:select * from ( select user_id, rounds, duration, row_number() over (partition by user_id order by rounds DESC, duration ASC, user_id ASC) as rn from hs ) t where rn = 1
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
das ist falsch, es müsste wenn so aus sehen:Code:select distinct on (user_id) user_id, rounds, duration from hs order by user_id, rounds desc, duration asc;
das geht aber ja nicht weil das distinct das order des distinct zuerst erwartet.Code:select distinct on (user_id) user_id, rounds, duration from hs order by rounds desc, duration asc, user_id;
das gleiche gilt für die windowing lösung.
ergebnis ist bei beiden:
korrekt wäre:Code:1;5;210;1 2;4;2200;1 3;6;2500;1
Code:3;6;2500;1 1;5;210;1 2;4;2200;1
wobei man die window funktion noch sortieren kann.
windowing hatte ich zu anfang auch versucht. mein fehler war aber, dass ich dannach auf der user_id distinct habe und dannach nach row_number sortiert habe in 2 subselects. damit hatte ich zwar die richtige sortierung zum user aber nicht die passende werte. aber die variante sieht jetzt sehr gut aus.Code:select * from ( select user_id, rounds, duration, row_number() over (partition by user_id order by rounds DESC, duration ASC, user_id ASC) as rn from hs ) t where rn = 1 order by rounds DESC, duration ASC, user_id ASC
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen