首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将事件后的多个重复计数为单个重复。

将事件后的多个重复计数为单个重复。
EN

Stack Overflow用户
提问于 2014-05-20 20:13:34
回答 1查看 154关注 0票数 1

我想要做的是想出一个查询,它可以给出初始事件30天内重复次数的百分比,但只能将30天内的任何事件作为一个重复计算出来。以下是针对单个人的示例数据集:

══════════════

一种更高的、更高的

一种更高的商品

一种更高的商品

一种更高的商品

一种自愿性的商品

在这种情况下,3/21将是重复事件,3/29将不算作第二次事件。4/14将是下一个窗口的开始,4/17将是第二次重复。

为了在这里计算重复次数的百分比,分子将是在一个月中有一个初始事件,并且在30天内有一个后续事件的人的不同计数。分母是那个月有事件的人的一个不同的计数。在跨越月份的情况下,重复计算在初始事件的月份内。

我知道我可以想出一些使用循环/游标或临时表的方法,但是随着数据集的增长,这将花费很长时间。有没有人想过如何作为一个查询来完成这个任务?这可能会牵涉到几个CTE。我想出的一切都失败了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-20 21:20:42

不错的一个..。试试这个:

代码语言:javascript
运行
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23769045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档