2016-05-20 3 views
0

I mit 2 Spalten eine Tabelle (id, name) mit folgenden Werten:TSQL: Eine Reihe erhalten, die einen maximalen Wert für eine Spalte hat

id name 
--- --- 
1 John 
2 John 
3 Mary 
4 Mary 

Für Werte, die in ‚Namen‘ wiederholt werden, I nur diejenigen Zeilen auswählen wollen, die in 'id' den maximalen Wert haben. Also meine gewünschte Ausgabe ist:

id name 
--- --- 
2 John 
4 Mary 

Ich habe versucht, folgende Anweisungen von diesem Link: Fetch the row which has the Max value for a column aber konnte es nicht zu arbeiten.

Dies ist die Abfrage Ich verwende:

select 
    name, id 
from 
    (select 
     name, max(id) over (partition by name) max_ID 
    from sometable) 
where 
    id = max_ID 

Aber ich bin immer diese Fehlermeldung:

Incorrect syntax near the keyword 'where'.

Irgendwelche Ideen, was ich falsch mache?

Antwort

3

Wenn Sie Ihre Unterabfrage alias erhalten Sie die Syntaxfehler vermeiden ... versuchen „AS MyTable“ nach der schließenden Klammer setzen

select name, id 
FROM (select name, max(id) over (partition by name) max_ID from sometable) AS MyTable 
where id = max_ID 

Dies könnte allerdings einfacher sein:

SELECT name, MAX(id) FROM tablename GROUP BY name 
+0

erwähnenswert, dass die Alias-Syntax sein kann „... von sometable) MyTable“ oder mit einem ‚AS‘ wie so“den Namen mit mehr als einer Zeile auswählen können. ..von etwas) AS MyTable " – Shoeless

1

Ihre Unterabfrage

hat keine obligatorische alias
.. 
FROM (select name, max(id) over (partition by name) max_ID from sometable) t -- alias missing 
.. 
1

Sie verwenden ein Alias ​​für eine Aggregatfunktion in denen dies falsch.

mit Verwenden Sie

select * from my_table where id in ( 
select max(id) from my_table where name in 
(
    select name 
    from my_table 
    having count(*) >1 
    group by name)) ; 
Verwandte Themen