2009-11-10 20 views
8

To wydaje się być podstawowym rozwiązaniem, ale wydaje się, że go nie dostaję.Grupa SQL z zamówieniem

Weź to zapytanie:

  SELECT Category FROM Article 
      GROUP BY Category 

Chcę skutecznie to zrobić:

  SELECT Category, DatePublished FROM Article 
      GROUP BY Category 
      ORDER BY DatePublished DESC 

ja naprawdę nie chce wybrać datePublished, ale wydawało się mieć sens na zamówienie przez niego. To jednak nie działa.

Zasadniczo chcę zamówić kategorie według najnowszego artykułu DatePublished.

Odpowiedz

19
SELECT Category 
FROM Article 
GROUP BY 
     Category 
ORDER BY 
     MAX(DatePublished) DESC 

Ponieważ robisz GROUP BY, trzeba uruchomić jakąś funkcję zbiorczą nad kolumnami spoza ugrupowania.

MAX wybiera datę ostatniego opublikowanego artykułu z każdej kategorii i kategorii zamówień odpowiednio.

6

W agregacji (->GROUP BY), można wybrać tylko pola/używać w połączeniu z funkcjami agregacji (np SUM, MAX, MIN) oraz dziedzin wymienionych w GROUP BY -clause.

Prosty przykład:

A | B 
-----+----- 
1 | 2 
1 | 3 

jeśli chcesz napisać SELECT A,B FROM table GROUP BY A, że wydajność:

A | B 
-----+----- 
1 |{2,3} 

ale nie jest to możliwe (B ma 2 wartości w jednym rzędzie!?!). Musisz coś zrobić z wartościami B, które również je grupują. Więc dwie możliwości:

: Dodaj B w GROUP BY -clause

SELECT A,B FROM table GROUP BY A,B 

daje

A | B 
-----+----- 
1 | 2 
1 | 3 

: Użyj funkcji agregacji na B

SELECT A,MAX(B) FROM TABLE GROUP BY A,B 

daje

A | B 
-----+----- 
1 | 3 

Te same argumenty dotyczą klauzuli ORDER BY.

Większość czasu, gdy chcesz napisać oświadczenie jak pierwszy pokazałem się z, możliwość 1 jest rozwiązaniem, ponieważ może wiesz, że A i B należą wspólnie (wspólna próba: UserId i UserName), ale RDBMS go nie zna!