簡體   English   中英

如何從 SQL 服務器獲取每小時僅一個月內第一條記錄的記錄?

[英]How to get records from SQL Server for every hour only first record in a day in a month?

我有下面這樣的代碼,我想從 SQL 服務器為一天中每小時的第一條記錄生成過去 30 天的記錄。 每分鍾大約有 10 條記錄。 我想每小時只抓取一條記錄。 我每天只想要 24 條記錄

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

使用 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

您可以使用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”是第一條記錄。

我還將您的第二個比較更改為<而不是<= 這對我來說更有意義。

我認為這就是你要找的:

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 function,這給每一行一個關於指定分區的編號,在這種情況下,分區是為日和小時創建的,這意味着同一天和同一小時的記錄將被分配行號。 在外部查詢中,我返回被分配行號 1 的記錄,這意味着每天的每個小時只會返回一條記錄。

請記住,您可以在分區的 ORDER BY 部分添加另一個字段來指定您返回的記錄是什么記錄(例如,如果您想要每小時的最后一條記錄,您將 ORDER BY ordertime DESC)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM