滑动时段的数据汇总

问题描述

[由于@Gordon Linoff和@ shawnt00的评论,对查询和问题进行了编辑和修复]

我最近继承了一个SQL查询,该查询从日志数据库计算30天的时间窗口中某些事件的数量。它使用CTE(公用表表达式)生成从“ 2019-01-01”到现在的30天范围。然后以30/60/90天的间隔对案件进行计数。我不确定这是最好的方法。我所知道的是,它需要很长时间才能运行,而且我不完全了解它是如何工作的100%。因此,我正在尝试以一种有效的方式来重建它(也许我现在不知道它现在是最有效的方式)。

我有几个问题:

  1. 我注意到的一件事是,查询没有使用DATEDIFF,而是从日期开始减去了几天的时间。这是个好习惯吗?
  2. 有没有更好的时间比较方法
  3. 是否有更好的方法来完成整件事?底线是:我需要按30、60和90天时间段内的出现次数来汇总数据。

注意:LogDate原始格式类似于 2019-04-01 18:30:12.000

DECLARE @dt1 Datetime='2019-01-01'
DECLARE @dt2 Datetime=getDate();

WITH ctedaterange 
     AS (SELECT [Dates]=@dt1 
         UNION ALL
         SELECT [dates] + 30 
         FROM   ctedaterange 
         WHERE  [dates] + 30<= @dt2) 

SELECT 
[dates],lt.Activity,COUNT(*) as Total,SUM(CASE WHEN lt.LogDate <= dates and lt.LogDate > dates - 90 THEN 1 ELSE 0 END) AS Activity90days,SUM(CASE WHEN lt.LogDate <= dates and lt.LogDate > dates - 60 THEN 1 ELSE 0 END) AS Activity60days,SUM(CASE WHEN lt.LogDate <= dates and lt.LogDate > dates - 30 THEN 1 ELSE 0 END) AS Activity30days
FROM   ctedaterange AS cte
JOIN (SELECT Activity,CONVERT(DATE,LogDate) as LogDate FROM LogTable) AS lt
ON cte.[dates] = lt.LogDate
group by [dates],lt.Activity
OPTION (maxrecursion 0)

样本数据集(LogTable):

LogDate,Activity
2020-02-25 01:10:10.000,Activity01
2020-04-14 01:12:10.000,Activity02
2020-08-18 02:03:53.000,Activity02
2019-10-29 12:25:55.000,Activity01
2019-12-24 18:11:11.000,Activity03
2019-04-02 03:33:09.000,Activity01

预期的输出输出不会反映上面显示的数据,因为我需要样本集中的太多行才能在本文中显示

如上所述,最重要的是:我需要按30、60和90天时间段内的出现次数来汇总数据。

Activity,Activity90days,Activity60days,Activity30days
Activity01,3,1
Activity02,1,10,2
Activity03,5,3

谢谢您的任何建议。

解决方法

SQL Server尚不能选择范围超过分析函数窗口框架的。由于您已经生成了所有可能的日期,并且已经按日期获得了计数,因此很容易地回溯特定数量(汇总)的行以得出正确的总数。这是我建议的90天表达方式:

SELECT CONVERT(datetime,yourDateField + 'T' + LEFT(yourTimeField,2) + ':' + RIGHT(yourTimeField,2) + ':00',126)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...