SQL Server 在SQL查询中按小时分组[已关闭]

fquxozlt  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(244)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

昨天关门了。
Improve this question
我将获取全天每小时的数据。如果在特定小时收到交易,则将接收数据,其中包含“小时和交易量”,如下表中的“输入数据”所示。如果在特定小时未收到交易,则不会接收特定小时的数据。在一天结束时,我需要应用group by来了解3个小时的序列中收到的总交易金额。如果时间不在序列中,则可以忽略。

有谁能帮我用上面说的数据来申请group by?

mwecs4sa

mwecs4sa1#

您可以对小时使用case表达式,然后按它分组:

SELECT   hour, SUM(txamt) AS txamt
FROM     (SELECT CASE WHEN hour >=7   AND hour <= 9  THEN '07-09'
                      WHEN hour >= 11 AND hour <= 13 THEN '11-13'
                      WHEN hour >= 20 AND hour <= 22 THEN '20-22'
                 END AS hour,
                 txamt
          FROM   mytable) t
WHERE    hour IS NOT NULL
GROUP BY hour
iqih9akk

iqih9akk2#

在真实的的应用程序中,对函数的结果进行过滤或分组是一个坏主意,因为它不能利用任何索引。一个快速而灵活的方法是创建一个具有所需小时范围的实用程序表,确保开始列和结束列都被索引,例如:

CREATE TABLE Shifts
(
    ID int NOT NULL PRIMARY KEY IDENTITY,
    Name nvarchar(20) NOT NULL,
    Shift_Start int NOT NULL,
    Shift_End int NOT NULL,
    INDEX IX_Shifts (Shift_Start,Shift_End,Name)
)

INSERT INTO Shifts (Name,Shift_From,Shift_To)
VALUES 
('07-09',7,9),
('11-13',11,13),
('20-22',20,22)

使用Shifts表,可以按Shift_Name列对目标表进行过滤和分组:

SELECT Name as Hour,
       SUM(Amount) as Amount
FROM SourceTable t 
INNER JOIN Shifts 
     ON Shift_Start>= t.Hour and t.Hour <= Shift_End
GROUP BY Name

条件Shift_Start>= t.Hour and t.Hour <= Shift_End适用于换档限制不重叠的情况。但如果一个换档紧接着另一个换档开始,例如07-09'09-11',则条件应更改为

ON Shift_Start>= t.Hour and t.Hour < Shift_End

相关问题