sql - 获取过去 2 周在任何给定日期发生的事件
问题描述
我有类似的数据
id | date |
-------------
1 | 1.1.20 |
3 | 4.1.20 |
2 | 4.1.20 |
1 | 5.1.20 |
6 | 2.1.20 |
我想要得到的是在任何给定日期过去 2 周内具有 ID 的用户发生的次数,所以基本上是“日期 - 14 天和日期之间的发生次数。我试图按用户的数量对用户进行分类过去两周的会议,我每天都在关注他们。
此查询不起作用,因为可能有几天用户没有登录,也就是没有一行:
COUNT (distinct id) OVER (PARTITION BY id ORDER BY date ROWS BETWEEN 14 PRECEDING AND 0 FOLLOWING)
解决方案
不幸的是,Presto 不支持range()
窗口函数。一种方法是自联接/聚合或相关子查询:
select t.id, count(tprev.id)
from t left join
t tprev
on tprev.id = t.id and
tprev.date > t.date - interval '13' day and
tprev.date <= t.date
group by t.id;
这会将您的请求解释为需要 14 天的数据,包括当天。
另一种更冗长但可能更快的方法是使用lag()
. . . 再次lag()
:
select t.id,
(1 + -- current date
(case when lag(date, 1) over (partition by id order by date) > date - interval '14' day then 1 else 0 end) +
(case when lag(date, 2) over (partition by id order by date) > date - interval '14' day then 1 else 0 end) +
. . .
(case when lag(date, 13) over (partition by id order by date) > date - interval '14' day then 1 else 0 end) +
) as cnt_14
from t;
推荐阅读
- html -
使用 CSS的替代方案 - powerbi - 如何在powerbi中有条件地将测量值转换为短信
- scala - Akka http 构建 Uri
- cassandra - 在Cassandra中根据频繁间隔的时间范围选择记录
- android - 从 WebView 代理中完全删除 Android 作为操作系统
- php - Symfony/Doctrine - 从实体构造函数获取记录?
- javascript - 使用 axios 时可能出现未处理的 Promise 拒绝、网络错误
- javascript - 在 DOM 加载后验证引导模式表单和模式加载
- git - 需要将本地文件夹 git repo 更改为另一个不同的 git repo
- java - 如何将多个连接传递给 birt 报告?