获取每组的第一行,加上去年的相关行
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:
基本上我有以下来自查询的数据集,'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: