按小时分组但显示另一个字段

时间:2013-11-07 14:55:17

标签: sql sql-server grouping

我需要在某个小时内找到第一个和最后一个价格。目前我的查询有一个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;一个小时呢?所以像每半小时后的最终价格......等等。

1 个答案:

答案 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}}中添加日期值,从而将此延长至多天。