2009-06-19 95 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]
)

相关问题