0

当我尝试对特定时间范围内的发生次数求和时,我有以下问题。

假设我有下表:

     Date                New
     2013-01-01           1
     2013-01-01           0
     2013-01-01           0                                  
     2013-01-01           1
     2013-01-02           1
     2013-01-02           0
     2013-01-03           1
     2013-01-03           1
     2013-01-04           0
     2013-01-04           1
     2013-01-05           1

我想计算每两天出现的“新”数量。

在上面提供的示例中,我期望得到的结果如下:

     Date                 Result
     2013-01-01/02           3
     2013-01-02/03           3
     2013-01-03/04           3
     2013-01-04/05           2

你可以看到我在计算每两天发生的次数。

请注意,我正在使用一张大桌子(> 10m 行),我需要制作 > 50 个不同的范围(将每个 2 天的分组视为一个范围)。

我正在使用 SQL Server 2012。

在此先感谢您的帮助!

4

2 回答 2

1

Gordon Linoff 的答案对于 SQL 2012 来说更好,但我想我会尝试一个可以在以前版本中使用的替代方案,因为这是一个有趣的问题。

SELECT #table1.[Date], (SUM(new) + t.cnt2) AS cnt
FROM #table1
INNER JOIN (SELECT [Date], SUM(new) AS cnt2 
           from #table1 
           GROUP BY #table1.[date]) t ON #table1.[date] = t.[date]-1
GROUP BY #table1.[date], t.cnt2
于 2013-07-10T19:25:46.570 回答
1

这是一种聚合数据一次然后使用窗口函数进行计算的方法。当前一个日期比当前日期小一时,计算只是添加前一个值:

select date,
       (cnt + (case when DATEDIFF(day, prevdate, date) = 1 then prevcnt else 0 end)) as Result
from (select date, SUM(new) as cnt,
             lag(DATE) over (order by date) as prevdate,
             lag(SUM(new)) over (order by date) as prevcnt
      from t
      group by date
     ) t
于 2013-07-10T17:47:30.607 回答