我是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
失败)
答案 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)
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]
)