我想要做的是想出一个查询,它可以给出初始事件30天内重复次数的百分比,但只能将30天内的任何事件作为一个重复计算出来。以下是针对单个人的示例数据集:
人
══════════════
一种更高的、更高的
一种更高的商品
一种更高的商品
一种更高的商品
一种自愿性的商品
在这种情况下,3/21将是重复事件,3/29将不算作第二次事件。4/14将是下一个窗口的开始,4/17将是第二次重复。
为了在这里计算重复次数的百分比,分子将是在一个月中有一个初始事件,并且在30天内有一个后续事件的人的不同计数。分母是那个月有事件的人的一个不同的计数。在跨越月份的情况下,重复计算在初始事件的月份内。
我知道我可以想出一些使用循环/游标或临时表的方法,但是随着数据集的增长,这将花费很长时间。有没有人想过如何作为一个查询来完成这个任务?这可能会牵涉到几个CTE。我想出的一切都失败了。
发布于 2014-05-20 21:20:42
不错的一个..。试试这个:
create table #t (Person varchar(10), EventDate date);
insert #t (Person, EventDate)
values
('A', '3/1/14'),
('A', '3/21/14'),
('A', '3/29/14'),
('A', '4/14/14'),
('A', '4/17/14'),
('A', '8/3/14'),
('B', '3/25/14'),
('B', '4/2/14'),
('B', '4/20/14'),
('B', '6/14/14'),
('B', '8/17/14'),
('B', '8/26/14');
;WITH OrderedEvents AS (
SELECT Person, EventDate, ROW_NUMBER() OVER (PARTITION BY Person ORDER BY EventDate) AS Ord
FROM #t
)
, RepeatedEvents AS (
SELECT Person, EventDate, Ord, EventDate AS InitialDate
FROM OrderedEvents
WHERE Ord = 1
UNION ALL
SELECT o.Person, o.EventDate, o.Ord
, CASE WHEN DATEDIFF(DAY, r.InitialDate, o.EventDate) > 30 THEN o.EventDate ELSE r.InitialDate END
FROM OrderedEvents o
JOIN RepeatedEvents r ON o.Person = r.Person AND o.Ord = r.Ord + 1
)
, GroupedEvents AS (
SELECT Person, MONTH(InitialDate) AS Mth, YEAR(InitialDate) AS Yr
, IsRepeat = CASE WHEN COUNT(*) > 1 THEN 1 ELSE 0 END
FROM RepeatedEvents
GROUP BY Person, MONTH(InitialDate), YEAR(InitialDate)
)
SELECT Mth, Yr, CAST(SUM(IsRepeat) AS NUMERIC) / CAST(COUNT(DISTINCT person) AS NUMERIC) AS Pct
FROM GroupedEvents
GROUP BY Mth, Yr;
https://stackoverflow.com/questions/23769045
复制相似问题