[英]SQL: From a group by get another column on max date
所以我有一个表 more less like this name it tests_summary :
测试编号 | 完全的 | 其余的 | 得分日期 |
---|---|---|---|
200 | 6个 | 1个 | 2022-05-02 |
200 | 2个 | 7 | 2022-05-01 |
200 | 5个 | 10 | 2022-04-29 |
200 | 5个 | 15 | 2022-04-28 |
199 | 10 | 0 | 2022-05-02 |
199 | 2个 | 10 | 2022-05-01 |
首先,我尝试按每个 test_id 进行分组,对每个测试完成的 SUM 进行分组,但我想在剩余的列中获取最新分数日期中的剩余值。 例如test_id 200,最近的日期是2022-05-02,剩下1就是我想要的值。 在这张表中已经订购,但在我的真实表中没有。
预期结果
测试编号 | 完全的 | 其余的 |
---|---|---|
200 | 18 | 1个 |
199 | 12 | 0 |
版本 5.7.12
您可以使用行号 function 为您关心的每个项目提供 1。
请注意,我在这里使用 * 作为简写,但在最终代码中,您应该只使用 select 您感兴趣的列。
SELECT *
FROM (
SELECT z.*, ROW_NUMBER(PARTITION BY test_id ORDER BY score_date DESC) AS RN
FROM sometableyoudidnotname z
) X
WHERE X.RN = 1
您可以使用
SELECT test_id, completed, remaining
FROM (SELECT test_id,
remaining,
SUM(completed) OVER(PARTITION BY test_id) AS completed,
ROW_NUMBER() OVER(PARTITION BY test_id ORDER BY score_date DESC) AS rn
FROM t) tt
WHERE rn = 1
如果您的数据库及其版本适合使用窗口(或分析),您可以通过按test_id
降序排序同时按score_date
分区以按每个日期分组来获取最新日期 function
更新。 该解决方案仅适用于 PostgreSQL。 感谢霍根纠正我
我不确定我的解决方案是否是性能最佳的,但它仍然有效。 主要思想是在“剩余”列上使用DISTINCT ON构造,并使用子查询单独汇总“已完成”列:
WITH
t AS (SELECT 200 AS test_id,
0 AS completed,
1 AS remaining,
'2022-05-02'::DATE AS score_date
UNION
SELECT 200,
2,
3,
'2022-05-01'
UNION
SELECT 199,
10,
0,
'2022-05-02'
UNION
SELECT 199,
2,
10,
'2022-05-01')
SELECT
distinct on (t1.test_id)
t1.remaining,
t1.test_id,
(select sum(completed) from t where t.test_id = t1.test_id)
FROM t t1
ORDER BY t1.test_id,t1.score_date desc;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.