use*_*051 10 sql sql-server postgresql
与此问题类似,我需要将大量记录分组为1小时的"桶".例如,假设我有一个典型的ORDER表,每个订单附有一个日期时间.我希望看到每小时的订单总数.所以我大致使用SQL大致如下:
SELECT datepart(hh, order_date), SUM(order_id)
FROM ORDERS
GROUP BY datepart(hh, order_date)
Run Code Online (Sandbox Code Playgroud)
问题是如果给定的1小时"桶"中没有订单,则不会向结果集中发出任何行.我希望结果集在24小时内每行都有一行,但如果在特定小时内没有订单,只需将订单数记录为O.
有没有办法在单个查询中执行此操作?
另请参阅使用SQL获取每小时统计信息.
以前的一些答案建议使用小时表并使用UNION查询填充它; 使用公用表表达式可以做得更好:
; WITH [Hours] ([Hour]) AS
(
SELECT TOP 24 ROW_NUMBER() OVER (ORDER BY [object_id]) AS [Hour]
FROM sys.objects
ORDER BY [object_id]
)
SELECT h.[Hour], o.[Sum]
FROM [Hours] h
LEFT OUTER JOIN (
SELECT datepart(hh, order_date) as [Hour], SUM(order_id) as [Sum]
FROM Orders
GROUP BY datepart(hh, order_date)
) o
ON h.[Hour] = o.[Hour]
Run Code Online (Sandbox Code Playgroud)
您需要预先填充的表(或返回表结果集的函数)才能加入,其中包含结果中所需的所有1小时槽.
然后你用它进行OUTER JOIN,你应该得到它们.
像这样的东西:
SELECT SLOT_HOUR, SUM(order_id)
FROM
ONEHOURSLOTS
LEFT JOIN ORDERS ON DATEPART(hh, order_date) = SLOT_HOUR
GROUP BY SLOT_HOUR
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12001 次 |
最近记录: |