2009-06-19 9 views
0

Ich bin SELECT eine Gruppe von Datensätzen, aber eine Spalte ergibt unterschiedliche Werte in zwei oder mehr Ergebnissen. Ich möchte nur den oberen Wert SELECT; nicht die Min eins oder die Max Wert, aber die Top N Wert von SQL Server 2008. Gibt es Aggregation Mechanismus, der dies ausführen wird?Wie wählen Sie den obersten Datensatz aus einer Gruppe von Zeilen aus einer Tabelle in einer Datenbank aus?

z.

Tabelle hat:

Microsoft MSFT 12/21/05
Microsoft MSFT 10/22/05
Microsoft MSFT 11/23/06
Paramount PMNT 02/21/05
Paramount PMNT 01/23/06

ich ausführen:

SELECT       [Name], [Symbol], PriceDate
VON           aaa
GROUP BY [Name], [Symbol]

Das gewünschte Ergebnis ist:

Microsoft MSFT 12/21/05
Paramount PMNT 02/21/05

(TOP versagt)

+2

"TOP" ist bedeutungslos ohne ORDER BY. – RBarryYoung

+0

SQL Server speichert keine Zeilen in einer bestimmten Reihenfolge (gut, Clustered Indizes tun!) Und sind vorbehaltlich Änderungen nach SQL Server Laune.Es scheint, dass Sie tatsächlich die Funktion Min (PriceDate) möchten, diese aber in der Frage explizit ablehnen. Sonst geben Sie sich bedeutungslose Ergebnisse. – Eric

Antwort

0
SELECT TOP 1 [Name], [Symbol], PriceDate 
FROM  aaa 
GROUP BY [Name], [Symbol] 
+0

funktioniert das in SQL Server? Würde es sich nicht beschweren, dass die Preisfestsetzung keine Spalte für Gruppe oder eine Aggregatfunktion ist? –

0

Select TOP macht keinen Sinn, wenn Sie den Auftrag nicht gebe (mit ORDER BY smt), so dass Sie smt tun möchte, wie:

SELECT TOP N * 
FROM myTable 
ORDER BY anyFields 

Sie Ich bekomme möglicherweise widersprüchliche Ergebnisse (es gibt nichts, was das Gegenteil versichert) ohne Reihenfolge.

0

eine Art und Weise, Sie können auch eine Variable anstelle von 1, da SQL Server 2005

select top (1) * 
from SomeTable 
order by SomeColumn 
1

Hm verwenden, ich glaube, alle Antworten auf die Frage nicht beantworten (aber natürlich vielleicht habe ich die Frage falsch) :

Wenn Sie nicht gruppieren, könnten Sie z erhalten MSFT zweimal so beginnen wir mit so etwas wie dieses

select name, symbol, x(date) 
from sometable 
group by name, symbol 

Die Frage, wie ich es befasst sich mit der Funktion x() erhalten, die das erste Element der Datumsspalte in der jeweiligen Gruppe zurückzukehren. Das Problem ist: Es gibt keine natürliche Reihenfolge von Zeilen in einer relationalen Datenbank. Eine solche Funktion kann also nicht existieren, da sie nicht definiert ist.

Sie benötigen eine andere Spalte, die die Reihenfolge definiert, z. die Spalte timestamp:

Dies funktioniert zumindest in Oracle. Wenn sqlserver dies nicht mag, kann man es als Join neu schreiben. Die Alternative wäre analytische Funktionen, die ich gesagt wurde von Sqlserver unterstützt

+0

Sie antworten nicht, weil alle Antworten (wenn ich dies poste) vor der Neufassung der Frage stehen. – gbn

0

SELECT [Name], [Symbol], PriceDate
FROM   aaa
WHERE  PriceDate =
(
   SELECT Top 1 aaa_2.PriceDate FROM aaa aaa_2
    WHERE aaa_2.[Name]   = aaa.[Name]
      AND aaa_2.[Symbol] = aaa.[Symbol]
)

Verwandte Themen