【问题标题】:How to get records from SQL Server for every hour only first record in a day in a month?如何从 SQL Server 获取每小时的记录,仅在一个月的一天中的第一条记录?
【发布时间】:2019-11-14 04:05:57
【问题描述】:

我有下面这样的代码,我想从 SQL Server 为一天中每小时的第一条记录生成过去 30 天的记录。每分钟大约有 10 条记录。我想每小时只抓取一条记录。我每天只想要 24 条记录

SELECT * 
FROM table 
WHERE ordertime >= '2019-07-21 12:00' AND ordertime <= '2019-08-21 12:00' ;

【问题讨论】:

  • “一天中每小时的第一条记录”。不明白你的意思。样本数据和期望的结果真的很有帮助。
  • 每分钟大约有 10 条记录。我想每小时只抓取一条记录。我每天只想要 24 条记录。
  • 可能在问题中包含该描述

标签: sql sql-server


【解决方案1】:

使用 Row_Number

;with cte as
(
SELECT *,rn = row_number() over (partition by datepart(hour,getdate()) order by [key])

 FROM table WHERE 
ordertime >='2019-07-21 12:00' AND ordertime <= '2019-08-21 12:00> ;
)
select *
from cte where rn =1

【讨论】:

    【解决方案2】:

    您可以使用row_number() 获取每小时的第一条记录。正确的表达方式是:

    SELECT t.* 
    FROM (SELECT t.*,
                 ROW_NUMBER() OVER (PARTITION BY CONVERT(DATE, ordertime), DATEPART(HOUR, ordertime)
                                    ORDER BY ordertime
                                   ) seqnum
          FROM table t
         ) t
    WHERE ordertime >= '2019-07-21 12:00' AND
          ordertime < '2019-08-21 12:00' AND
          seqnum = 1;
    

    请注意,PARTITION BY 子句同时包含完整的日期和小时。这唯一地标识了每个小时。 ROW_NUMBER() 本身正在枚举行,基于 ORDER BY。所以,“1”代表第一条记录。

    我还将您的第二个比较更改为 &lt; 而不是 &lt;=。这对我来说更有意义。

    【讨论】:

      【解决方案3】:

      我想这就是你要找的:

      select * from (
          select *,
                 ROW_NUMBER() OVER(
                    PARTITION BY datepart(hour, ordertime ),datepart(day,ordertime ) ORDER BY ordertime 
                 ) rn from table 
      ) a 
      WHERE rn=1 and ordertime >='2019-07-21 12:00' AND ordertime <= '2019-08-21 12:00> ;
      

      这使用了 ROW_NUMBER 函数,这给每一行一个关于指定分区的编号,在这种情况下,分区是为日和小时制作的,这意味着同一天和同一小时的记录将被分配行号。在外部查询中,我返回被分配行号为 1 的记录,这意味着每天的每个小时只会返回一条记录。

      请记住,您可以在分区的 ORDER BY 部分添加另一个字段,以指定您返回的记录是什么记录(例如,如果您想要每小时的最后一条记录,您将 ORDER BY ordertime DESC)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 2011-12-17
        • 2017-12-15
        • 1970-01-01
        相关资源
        最近更新 更多