Przepraszamy za dwuznaczny tytuł, nie wiesz, jak szukać, lub zadaj to pytanie.Jak zwrócić pojedynczy wiersz na podstawie zagregowanej więcej niż jednej kolumny
Powiedzmy mamy TableA:
RowID FkId Rank Date ID1 A 1 2013-3-1 ID2 A 2 2013-3-2 ID3 A 2 2013-3-3 ID4 B 3 2013-3-4 ID5 A 1 2013-3-5
muszę utworzyć widok, który powróci 1 wiersz dla każdego FkId. Wiersz powinien mieć maksymalną rangę i maksymalną datę. Dla FkId "A" zapytanie zwróci wiersz "ID3".
Udało mi się zwrócić pojedynczy wiersz za pomocą podrzędnych zapytań; najpierw otrzymuję MAX (Rank), następnie dołączam do innego zapytania, które dostaje grupę MAX (Date) według FkId & Rank.
SELECT TableA.* (Select FkId, MAX(Rank) AS Rank FROM TableA GROUP BY FkId) s1 INNER JOIN (Select FkId, Rank, MAX(Date) AS Date FROM TableA GROUP BY FkId,Rank) s2 ON s1.FkId = s2.FkId AND s1.Rank = s2.Rank INNER JOIN TableA ON s2.FkId = TableA.FkId AND s2.Rank = TableA.Rank AND s2.Date = TableA.Date
Czy istnieje bardziej wydajne zapytanie, które zapewni takie same wyniki? Dzięki za spojrzenie.
Edytuj: Dodano ID5 od czasu ostatniej odpowiedzi. Gdybym spróbował normalnego MAX (pozycja), MAX (Data) GROUP BY FkId, to dla "A" dostałbym A; 2; 2013-3-5. Ten wynik nie byłby zgodny z identyfikatorem RowId.
Jaki jest typ danych rangi? –
Wiersz z datą maksymalną ze wszystkich wierszy z maksymalną pozycją? Lub wiersz z maksymalną pozycją ze wszystkich wierszy z maksymalną datą? (te dwa mogą się różnić!) –
@AaronKurtzhals: numeric – csthopper