【问题标题】:How to improve this aggregation queries for different timeframe in SQL如何改进 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 万条记录。

【问题讨论】:

    标签: sql-server join aggregation


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2021-05-20
      相关资源
      最近更新 更多