获取每组的第一行,加上去年的相关行

Get first row per group, plus related row from last year

基本上我有以下来自查询的数据集,'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 年的值,这也是一种情况。

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() 获得第一行通常不是性能之王。参见:

  • Select first row in each GROUP BY group?

关于 TABLE shorthand: