我需要在某个小时内找到第一个和最后一个价格。目前我的查询有一个WHERE
子句,用于确定我正在查看的小时数。
有没有办法做到这一点,以便我可以告诉我特定日期的每小时的结果?
SELECT TOP 1 Price FROM MyData WHERE [Product] = 'XXXXXX' AND CAST([Deal] AS Date) = '2013-09-04' AND DATEPART(HOUR, [Deal]) = 9 Order By (datediff(minute, '1990-1-1', [Deal Time]) /60)
Deal
字段的类型为DateTime
AND DATEPART(HOUR, [Deal]) = 9
这是我想用一些东西取而代之的,这些东西可以让我只看到价格是那小时第一个价格的所有条目?
编辑我希望能够在任何N分钟内完成<&lt;一个小时呢?所以像每半小时后的最终价格......等等。
答案 0 :(得分:1)
您正在尝试查找每小时的最后价格(而不是最高价格)。你可以这样做。让我从你的查询开始,这样你就可以看到转换(这是格式化的,所以我可以轻松阅读):
SELECT TOP 1 Price
FROM MyData
WHERE [Product] = 'XXXXXX' AND
CAST([Deal] AS Date) = '2013-09-04' AND
DATEPART(HOUR, [Deal]) = 9
Order By (datediff(minute, '1990-1-1', [Deal Time]) /60)
这个想法是在每小时内为每条记录分配一个序号。此号码将从最近的时间戳开始下降。然后,最新价格是顺序值为1的价格。这使用窗口函数row_number()
。
生成的查询不使用显式聚合:
select DATEPART(HOUR, [Deal]), price
from (select md.*,
row_number() over (partition by DATEPART(HOUR, [Deal])
order by [Deal] desc) as seqnum
from MyData md
where [Product] = 'XXXXXX' AND
CAST([Deal] AS Date) = '2013-09-04'
) md
where seqnum = 1;
您可以将此日期条件从where
子句移除到partition by
并在{{1}}中添加日期值,从而将此延长至多天。