0

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

4

1 回答 1

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.

于 2013-11-07T15:07:35.367 回答