如何从数据库中的表中选择一组行中的最高记录?

时间:2009-06-19 19:23:22

标签: sql sql-server

我是SELECT一组记录,但是一列在两个或多个结果中产生不同的值。我只想SELECT最高价值;不是Min一个或Max值,而是SQL Server 2008遇到的Top N值。是否有任何聚合机制可以执行此操作?

E.g。

表格有:

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

我执行:

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

期望的结果是:

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

TOP失败)

5 个答案:

答案 0 :(得分: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支持

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果你没有指定顺序(Select TOP smt),那么

ORDER BY没有意义,所以你想做smt:

SELECT TOP N *
FROM myTable
ORDER BY anyFields

如果没有订单,你可能会得到不一致的结果(没有什么可以保证相反)。

答案 3 :(得分:0)

单步,你也可以使用变量而不是自sql server 2005以来的1

select top (1) * 
from SomeTable
order by SomeColumn

答案 4 :(得分: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]
)