【问题标题】:获取每组的第一行,加上去年的相关行
【发布时间】:2021-12-07 11:45:16
【问题描述】:

基本上我有以下来自查询的数据集,“rn”是一个分区,用于为下一个需求添加行号:

WITH dataset AS (...)
-- gives

business_id | amount |  year |  month |   row_num
--------------------------------------------
1000          2000      2021      9       1
1000          1000      2021      9       2
1000          1500      2021      8       3
1000          1000      2020      9       4
1000          1000      2020      8       5
1043          4000      2021      8       1
1043          4500      2021      7       2
1043          4000      2021      6       3
1043          4100      2021      5       4
1043          4200      2021      4       5
1043          5000      2020      12      6
1043          5500      2020      11      7
1043          5600      2020      10      8
1043          5100      2020      9       9
1043          5300      2020      8       10
1043          5100      2020      7       11
1043          5000      2020      6       12
1139          4000      2021      9       1
1139          3000      2021      8       2
1139          2000      2021      7       3
1139          1000      2020      6       4

我的第一个要求是获取每个业务的最新年/月值,我可以通过选择rn = 1 来做到这一点,如下所示:

WITH dataset AS (...)
SELECT * FROM dataset WHERE row_num = 1
-- gives

business_id | amount |  year |  month | row_num
-----------------------------------------------
1000          2000      2021      9       1
1043          4000      2021      8       1
1139          4000      2021      9       1

到目前为止一切顺利,我不知道该怎么做的第二个要求是从去年获得相同的记录来比较当前年份,所以我需要这个数据集:

business_id | amount |  year |  month | row_num
-----------------------------------------------
1000          2000      2021      9       1
1000          1000      2020      9       4
1043          4000      2021      8       1
1043          5300      2020      8       10
1139          4000      2021      9       1

任何想法如何做到这一点?请注意,最后一条记录没有 2020 年的值,这也是一种情况。

【问题讨论】:

    标签: sql postgresql greatest-n-per-group common-table-expression


    【解决方案1】:
    WITH dataset AS (...)
       , base    AS (SELECT * FROM dataset WHERE row_num = 1)
    TABLE base
    UNION ALL
    SELECT d.*
    FROM   base b
    JOIN   dataset d ON d.business_id = b.business_id
                    AND d.year = b.year - 1
                    AND d.month = b.month
    

    我添加了另一个 CTE,并在外部 SELECT 中引用它两次,使用 UNION ALL。你可以添加任何你想要的ORDER BY,也许......

    ORDER BY business_id, row_num
    

    UNION ALL 仅添加去年的相关行(如果存在)。

    很有可能,可以优化查询。使用row_number() 获得第一行通常不是性能之王。见:

    关于TABLE 速记:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-24
      • 2014-09-29
      • 2022-11-29
      • 2014-11-10
      • 2019-05-24
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多