繁体   English   中英

SQL:从组中获取最大日期的另一列

[英]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;

output 结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM