[英]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.