2009-06-19 40 views
0

我是SELECT一組記錄,但一列在兩個或多個結果中產生不同的值。我只想SELECT的最高價值;而不是Min之一或Max的值,但是SQL Server 2008遇到的Top N值。是否有任何聚合機制會執行此操作?如何從數據庫中的表中選擇一組行的最高記錄?

例如,

表有:

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

我執行:

選擇      [名],[符​​號],PriceDate
FROM           AAA
GROUP BY [名],[符​​號]

期望的結果是:

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

TOP失敗)

+2

「TOP」的支持是毫無意義的一個ORDER BY。 – RBarryYoung 2009-06-19 20:07:49

+0

SQL Server不以任何特定順序存儲行(當然,Clustered Indexes可以!),並且完全可以在SQL Server的突發奇想中進行更改。事實上,您似乎確實需要Min(PriceDate)函數,但在問題中明確否定它。否則,你給自己無意義的結果。 – Eric 2009-06-19 21:36:12

回答

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

doas這個工作在sql服務器?難道它不會抱怨定價不是按專欄分組還是集合功能? – 2009-06-19 20:07:30

0

Select TOP沒有任何意義,如果你不指定順序(與ORDER BY SMT),所以你想要做SMT,如:

SELECT TOP N * 
FROM myTable 
ORDER BY anyFields 

你可能會得到不一致的結果(沒有什麼可以保證相反的結果),而無需排序。

0

的一種方式,你也可以使用一個變量,而不是1,因爲SQL Server 2005中

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

嗯,我覺得所有的答案不回答這個問題(當然,也許我的問題是錯誤的) :

如果你不分組,你可能會得到MSFT兩次 所以我們開始像這樣

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

的問題,因爲我得到它涉及函數x(),它是返回日期列的第一個元素各自的小組。問題是:關係數據庫中沒有行的自然順序。所以這樣的函數不能存在,因爲它沒有被定義。

您需要另一列來定義順序,例如,列時間戳:

select 
    a.name, 
    a.symbol, 
    (
     select b.date 
     from sometable 
     where b.timestamp = min(a.timestamp) 
     and a.name = b.name 
     and a.symbol = b.symbol 
    ) as first_date 
from sometable as a 
group by name, symbol 

這至少在oracle中有效。如果sqlserver不喜歡這個,可以將它重寫爲一個連接。 另一個選擇是,我被告知解析功能由SQLSERVER

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]
)

相關問題