Как улучшить эту агрегацию запросов для разных временных периодов в SQL

#sql-server #join #aggregation

Вопрос:

Я использую 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')
 

Я пытаюсь сделать агрегации для разных таймфреймов (последние 7 дней, последние 30 дней,последние 60 дней,последние 90 дней)

Я попытался использовать Join здесь :

 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
 

Есть ли какой-нибудь лучший способ сделать это?

Обновлена ссылка на скрипку здесь

У меня 12,5 млн записей.

Ответ №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