2009-11-10 13 views
8

Das fühlt sich an, als sollte es eine grundlegende Lösung haben, aber ich scheine es nicht zu bekommen.SQL-Gruppe mit Auftrag von

Nehmen Sie diese Abfrage:

  SELECT Category FROM Article 
      GROUP BY Category 

Ich möchte dies effektiv tun:

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

ich wirklich nicht wählen datePublished wollen, aber es schien Sinn zu machen, indem es zu bestellen. Das funktioniert aber nicht.

Grundsätzlich möchte ich Kategorien nach dem neuesten DatePublished Artikel bestellen.

Antwort

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

Da Sie eine GROUP BY tun, müssen Sie einige Aggregatfunktion über Nicht-Gruppierungsspalten laufen.

MAX wählt das Datum des letzten veröffentlichten Artikels aus jeder Kategorie und Reihenfolge Kategorien entsprechend.

6

In Aggregationen (->GROUP BY), können Sie nur wählen/Verwendung Felder in Kombination mit Aggregationsfunktionen (z SUM, MAX, MIN) und in der GROUP BY -Klausel aufgelistet Felder aus.

Einfaches Beispiel:

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

wenn Sie SELECT A,B FROM table GROUP BY A schreiben würden, würde ergeben:

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

aber das ist nicht möglich (B hat zwei Werte in einer Reihe!?!). Sie müssen etwas mit den Werten von B machen, die sie auch gruppiert. So zwei Möglichkeiten:

: In B im GROUP BY -Klausel

SELECT A,B FROM table GROUP BY A,B 

ergibt

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

: Verwenden Sie eine Aggregationsfunktion auf B

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

gibt Ihnen

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

Die gleichen Argumente an die ORDER BY Klausel anzuwenden.

der Zeit die meisten, wenn Sie eine Anweisung wie die erste schreiben möchte ich mit auftauchten, Möglichkeit 1 ist die Lösung, da Sie wissen, dass A und B zusammengehören (gemeinsame Probe: UserId und UserName), aber die RDBMS weiß es nicht!