如何改进 SQL 中不同时间范围的聚合查询
Posted
技术标签:
【中文标题】如何改进 SQL 中不同时间范围的聚合查询【英文标题】:How to improve this aggregation queries for different timeframe in SQL 【发布时间】:2021-08-20 22:07:39 【问题描述】:我使用的是 SQL Server 2017
创建表的脚本:
Create table tb(
ID INT Identity(1,1),
MUID INT ,
VisitDTM DateTime not null,
EventAction Varchar(20)
);
Insert into tb(MUID,VisitDTM,EventAction)
values
(5001,'2021-03-08 13:18:06.000','Open'),
(5001,'2021-03-12 13:05:13.000','Ad'),
(5001,'2021-03-18 13:18:06.000','Ad'),
(5001,'2021-05-29 13:18:06.000','Open'),
(5001,'2021-05-31 13:18:06.000','Open'),
(5001,'2021-06-02 00:48:49.000','Open'),
(5005,'2021-01-01 13:18:06.000','Open'),
(5005,'2021-02-11 13:05:13.000','Ad'),
(5005,'2021-03-18 13:18:06.000','Ad'),
(5005,'2021-05-02 13:18:06.000','Open'),
(5005,'2021-05-31 13:18:06.000','Open'),
(5005,'2021-05-31 23:58:47.000','Open'),
(5005,'2021-05-31 23:58:47.000','Ad'),
(5005,'2021-05-31 23:58:47.000','Ad'),
(5005,'2021-05-31 23:59:43.000','Open')
我正在尝试为不同的时间范围(last7days、last30days、last60days、last90days)进行聚合
我试过在这里加入:
select *
from
(select MUID, count(VisitDTM) as VisitsinLast7days
from tb
where VisitDTM > DATEADD(day, -7, GETDATE())
group by MUID
)a
Join
(
select MUID, count(VisitDTM) as VisitsinLast30days
from tb
where VisitDTM > DATEADD(day, -30, GETDATE())
group by MUID
) b on a.MUID = b.MUID
有没有更好的方法?
Updated Fiddle link here
我有 1250 万条记录。
【问题讨论】:
【参考方案1】:我猜,你可以使用“条件聚合”
SELECT X.[MUID],
SUM(
CASE
WHEN VisitDTM > DATEADD(day, -7, GETDATE()) THEN 1
ELSE 0
END
)AS Last7Days,
SUM(
CASE
WHEN VisitDTM > DATEADD(day, -30, GETDATE()) THEN 1
ELSE 0
END
)AS Last30Days
FROM [dbo].[tb] AS X
GROUP BY X.MUID
【讨论】:
以上是关于如何改进 SQL 中不同时间范围的聚合查询的主要内容,如果未能解决你的问题,请参考以下文章
18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询