2017-06-28 2 views
0

Ich habe eine Tabelle, die so aussieht.SQL-Abfrage vom höchsten Wert aus Duplikaten

username | vendor | time 
------------------------- 
x  | a  | 10 
x  | b  | 11 
x  | c  | 12 
y  | a  | 9 
y  | c  | 14 

Ich mag die Zeilen ziehen mit dem höchsten Zeitwert unter ihren Benutzername, so sollte es so aussehen:

username | vendor | time 
------------------------- 
x  | c  | 12 
y  | c  | 14 

Ich habe keine Ahnung, wie diese nach ein paar Abfragen gehen Ich habe nicht bekommen, was ich wollte. Wie würde das aussehen? Vielen Dank!

+4

Tag die Frage mit * ein * Datenbank Sie verwenden . Ich habe mehrere Tags entfernt. –

+0

es ist nicht klar, was Sie genau erreichen wollen – amal50

Antwort

1

Dieser Code ist ziemlich Datenbank Agnostiker:

SELECT username, vendor, MAX(time) 
FROM foo 
WHERE vendor = 'c' 
GROUP BY username, vendor; 

Wenn es nach mir ginge, würde ich eine analytische Funktion verwenden möchte (persönliche Vorliebe, wirklich). Dies ist sowohl in MS SQL Server und Oracle unterstützt:

SELECT username, vendor, MAX(time) OVER (PARTITION BY username, vendor) 
FROM foo 
WHERE vendor = 'c'; 

hier ein SQL Fiddle ist.

0

Sie können mit der ANSI-Standard-Fensterfunktion row_number():

select t.* 
from (select t.*, 
      row_number() over (partition by username order by time desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
+1

Da der Benutzer nicht angegeben, würde ich davon ausgehen, dass sie MySQL verwenden, die die Fensterklausel nicht unterstützt. – Jacobm001

+0

@ Jacobm001. . . Das ist eine unglaublich nutzlose und anmaßende Annahme. –

+0

Nicht wirklich. Es ist leicht die am häufigsten verwendete Datenbank unter Anfängern, die das OP eindeutig ist. Es ist nur erwähnenswert, dass Ihre Lösung plattformspezifisch ist. – Jacobm001

0

Ich bin nicht sicher, dass das OP einen Anbieter Filter will, so dass die folgenden time für jeden username, und die verknüpfte vendor erhalten.

Dies ist die gleiche Annahme wie Jacobm001 machen, dass es MySQL

select * from (select username, vendor, time from foo order by time desc) as t 
group by username 

Wo foo der Name Ihrer Tabelle ist

SQL Fiddle

Verwandte Themen