最近10周滚动的TSQL计数
我有一个表,简单到两列名称,日期-当用户从我们的网站查询时,它是一个有潜在客户的表 我需要生成过去10个滚动周的潜在客户计数数据集 假定预期输出为最近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行 这就
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。将查询转换为周时,您需要将订单更改为周,而不是天。