最近10周滚动的TSQL计数

最近10周滚动的TSQL计数,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有一个表,简单到两列名称,日期-当用户从我们的网站查询时,它是一个有潜在客户的表 我需要生成过去10个滚动周的潜在客户计数数据集 假定预期输出为 Starting Week -- Count ============== 10 SUM(Last 10 weeks) 9 SUM(Starting from Week 9 for Last 10 weeks) 8 SUM(Starting from Week 8 for Last 10 weeks) 等等。。它将有10行 这就

我有一个表,简单到两列名称,日期-当用户从我们的网站查询时,它是一个有潜在客户的表

我需要生成过去10个滚动周的潜在客户计数数据集

假定预期输出为

Starting Week -- Count
==============
10     SUM(Last 10 weeks)
9    SUM(Starting from Week 9 for Last 10 weeks)
8    SUM(Starting from Week 8 for Last 10 weeks)
等等。。它将有10行

这就像是向后滑一周,然后把最后10周的时间加起来


有什么帮助吗?

您可以使用以下查询:

SELECT Name,
       weekSlide + 1 AS weekSlide,
       COUNT(CASE WHEN weekDiff BETWEEN 0 AND 9 THEN 1 END) AS [Count]
FROM (
  SELECT Name,
         DATEPART(week, [Date]) AS weekNo,
         (x.c - DATEPART(week, [Date])) + 
         (YEAR(GETDATE()) - DATEPART(year, [Date])) * 52 - 
         y.weekSlide AS weekDiff,      
         y.weekSlide
  FROM mytable
  CROSS JOIN (SELECT DATEPART(week, GETDATE())) x(c) -- current week number
  CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) AS y(weekSlide)) t
GROUP BY Name, weekSlide
weekSlide是周窗口的计数器,即,包含从当前日期的一周开始的最后10周的周窗口为0,从前一周开始的周窗口为1,等等

weekDiff是一个计算列,包含每个weekSlide的[Date]偏移量。负偏移量意味着[日期]超过了周窗口

我将使用:

DECLARE @week INT, @end_date DATE
DECLARE @results AS TABLE (starting_week INT, count INT)

SET @week = 0
WHILE @week < 10
BEGIN
    SELECT @end_date = DATEADD(dd, @week * (-7), GETDATE())
    INSERT INTO @results
    SELECT (10 - @week),
           COUNT(1) FROM Leads
               WHERE Date BETWEEN (DATEADD(dd, -70, @end_date)) AND @end_date
    @week = @week + 1
END

SELECT * FROM @results

编辑:虽然Brian的问题注释添加到您的初始问题中是一个很好的注释-如果不是从今天开始回滚,那么您需要在@end_date的定义中添加另一行逻辑。

您可以对计数进行如下累计:

select DATEPART(week, [Date]) AS weekNo
  ,sum(count(*)) 
   over (order by DATEPART(week, [Date])
         rows unbounded preceding)
from tab
where ...
group by DATEPART(week, [Date])
这正是windowing子句应该做的。但是,您首先需要聚合数据:

select date, count(*) as cnt
from simple s
group by date;
假设您每天都有数据,那么您需要70天的计数。通过对70天的计数求和得到。这将是:

select date, count(*) as cnt,
       sum(count(*)) over
           (order by date rows between 69 preceding and current row)
from simple s
group by date;
这可以用几天。要按周计算,您需要将天转换为周,然后更改windowing子句。您没有定义一周,但这可能接近您想要的:

select dateadd(day, 1 - datepart(weekday, date), date) as weekstart,
       count(*) as cnt,
       sum(count(*)) over
           (order by dateadd(day, 1 - datepart(weekday, date), date) rows between 9 preceding and current row)
from simple s
group by dateadd(day, 1 - datepart(weekday, date), date)
order by weekstart;

星期定义为星期一到星期天。这不太有效,因为您是通过表达式分组的。order by date抛出一个错误,列“simple.date”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP by子句中。@user18620。将查询转换为周时,您需要将订单更改为周,而不是天。