2017-04-17 3 views
0

Sagen, ich habe eine TabelleSQL aus jeder Gruppe max-Wert erhalten

Tabelle

Spielt
date  | track_id | user_id | rating 
----------------------------------------- 
20170416 | 1   | 1  | 3 (***) 
20170417 | 1   | 1  | 5 
20170418 | 2   | 1  | 1 
20170419 | 3   | 1  | 4 
20170419 | 3   | 1  | 2 (***) 
20170420 | 1   | 2  | 5 

Was ich tun möchte, für jede eindeutige track_id ist, User_id ich die höchste Bewertung Zeile wollen. I.e. erzeugt dies die folgende Tabelle, wo (***) Zeilen entfernt werden.

20170417 | 1   | 1  | 5 
20170418 | 2   | 1  | 1 
20170419 | 3   | 1  | 2 
20170420 | 1   | 2  | 5 

Eine Idee, was eine sinnvolle SQL-Abfrage ist, dies zu tun?

+1

Warum für track_id = 3 und user_id = 1 erwarten Sie Bewertung = 2, aber nicht 4? – mnv

Antwort

1
select * from [table] t1 
inner join 
(
select track_id, user_id, max(rating) maxRating 
from [table] 
group by track_id, user_id 
) tmp 
on t1.track_id = tmp.track_id 
and t1.user_id = tmp.user_id 
and t1.rating = tmp.maxRating; 
1

Angenommen, Sie max Datum wollen auch, versuchen Sie Folgendes:

SELECT track_id, user_id, MAX(rating), MAX(date) 
FROM plays 
GROUP BY track_id, user_id; 
2

Verwenden MAX zusammen mit GROUP BY-Klausel in Funktion gebaut:

SELECT track_id, user_id, MAX(rating) 
    FROM Your_table 
    GROUP BY track_id, user_id; 
1

Wenn Sie zusätzliche Spalten haben die nicht in der GROUP BY Klausel erwähnt, können Sie für eine Unterabfrage wie gehen:

SELECT track_id,user_id,rating --, other columns you want to display 
FROM(
     SELECT track_id, user_id, rating,ROWNUMBER() OVER(PARTITION BY track_id, user_id ORDER BY rating DESC) as RN --,Other columns which you want to display 
     FROM Your_table 
         ) X 
WHERE X.RN=1 
Verwandte Themen