sql - 根据条件计算 maxdate
问题描述
(抱歉,如果我没有正确格式化问题,这是我的第一篇文章)。
我有以下示例数据:
a.label | b.recipient_id| b.action|b.creation_date
Books | Recipient1 | 0 | 01/04/2018
Books | Recipient1 | 1 | 02/04/2018
Books | Recipient1 | 0 | 03/04/2018
Books | Recipient1 | 1 | 04/04/2018
Books | Recipient2 | 1 | 05/04/2018
Books | Recipient2 | 0 | 06/04/2018
Books | Recipient2 | 0 | 07/04/2018
Books | Recipient2 | 1 | 08/04/2018
Books | Recipient3 | 1 | 13/04/2018
Books | Recipient3 | 0 | 14/04/2018
Books | Recipient3 | 1 | 15/04/2018
Books | Recipient3 | 0 | 16/04/2018
我想计算 max(creation_date) action = 1 的接收者 ID
如果 max(creation_date) action 等于 0,我根本不想计算这个收件人。
所以在我上面的示例数据中,我想计算 Recipient1 和 Recipient2 但不计算 Recipient3。
我尝试了以下变化,但到目前为止没有任何效果
SELECT count(b.recipient_id)
FROM Services a, Subscriptions b,
(SELECT recipient_id,MAX(creation_date)
FROM Subscriptions
GROUP BY recipient_id) c
WHERE a.SERVICE_ID = b.SERVICE_ID
AND b.recipient_id = c.recipient_id
AND b."ACTION" = '1'
AND a.LABEL = 'Books'
提前致谢
解决方案
这是一种方法,使用两个级别的聚合:
select count(*)
from (select su.recipient_id
from services se join
subscriptions su
on se.service_id = su.service_id
where se.label = 'BOOKS'
group by su.recipient_id
having max(su.creation_date) = max(case when su.action = 1 then su.creation_date)
) ss;
该having
子句检查最终状态是否为1
。
笔记:
- 切勿在
FROM
子句中使用逗号。 - 始终使用正确、明确、标准
JOIN
的语法。 - 使用有意义的表别名,例如表名的缩写,而不是任意字母。
- 使用单引号来分隔字符串。如果有必要,可以使用双引号来转义标识符。
推荐阅读
- mysql - 对 MySQL 中的纬度和经度数据使用 DECIMAL(17,13) 时是否对性能有影响?
- firebase - Firebase 控制台创建动态链接错误
- python - 从熊猫数据框加载的 QTableView 中的多列过滤错误
- node.js - Node.JS/Express - 如何避免多个数据库查询
- java - Spark 从 cassandra 获取 ttl 列
- java - 将约束视图转换为文本视图时出现致命错误
- reactjs - React 处理多个复选框
- python - 如何从 py 3.6 的播放列表中打开随机视频?
- java - 在 linux 主机上创建 osx java app 发行版
- excel - 在 VBA MsgBox 中循环