sql - sql中的分析
问题描述
我有一个具有以下结构的表:
use_id (int) - event (str) - time (timestamp) - value (int)
事件可以取多个值:安装、登录、购买等。
我需要在更新应用程序之前获取所有用户记录。例如,我的应用程序发布时刻 - 2019 年 1 月 1 日,但用户可能会在任何一天安装新版本。
我怎样才能得到sum(value)
第一个和第二个版本。---------
我尝试了自连接表,但我认为这不是最好的解决方案。
请帮帮我。
解决方案
这是您的表格的定义(正如我从您的评论和描述中理解的那样):
CREATE TABLE user_events (
user_id integer,
event varchar,
time timestamp without time zone,
value integer
);
这是您要求的查询:
SELECT
COUNT(user_id),
SUM(value)
FROM (
SELECT
DISTINCT ON (user_id)
user_id,time,value
FROM user_events
WHERE event='install'
ORDER BY user_id, time DESC
) last_installations
WHERE
time BETWEEN date '2018-01-01' AND date '2019-01-01';
一些解释:
- 内部查询 (
last_installations
) 为每个用户选择最后安装事件 - 外部查询仅过滤出第一和第二版本的安装,并计算
SUM(value)
(如您所问)和COUNT(user_id)
(为了清楚起见,我添加了 - 现在有多少用户正在使用 1 和 2 版本)
更新
所有事件的总和值(按版本)
SELECT
event,
CASE
WHEN time BETWEEN date '2018-01-01' AND timestamp '2018-05-30 23:59:59' THEN 1
WHEN time BETWEEN date '2018-06-01' AND timestamp '2018-12-31 23:59:59' THEN 2
WHEN time > date '2018-01-01' THEN 3
ELSE 0 -- unknown version
END AS version,
SUM(value)
FROM user_events
GROUP BY 1,2
推荐阅读
- dagger-2 - Dagger 2 依赖循环
- python - 如何输入同时接受联合和任何类型的联合的提示函数?
- c# - 什么可能导致选择缺少 activeGameObject?
- sql - 临时表结果到变量不起作用
- javascript - 有没有一种方法可以检查数组是否在 SQLite 中包含一个值?
- swift - swift - 结合 UIView.transition 的链接动画
- computer-vision - Yolo:PyTorch 与暗网
- java - 如何调整 ListView 的搜索过滤器,其中项目是每个包含 2 个字符串的对象?(不是每个项目 1 个字符串。)
- vb.net - 不能引用类的实例成员
- mysql - mysql:我可以使用案例表达式来执行其他语句吗?