我正在编写一个查询,并希望创建一个执行以下操作的 CASE 语句:
对于每个
Id
,我应该从两列中取出最大年份:End_Year
和Complete_Year
,以及
使用 Country_Code
或
End_Year
将最大年份
与对应的
Complete_Year
进行匹配
由于某些技术限制,希望在 CASE 语句中执行此操作
这相当复杂:/
样本表:
身份证 | 国家/地区代码 | 年末 | 完成_年 |
---|---|---|---|
101 | 美国 | 2022 | 2023 |
101 | ARG | 2021 | 2022 |
102 | CAN | 2026 | 2025 |
102 | CAN | 2022 | 2023 |
我想要的输出是:
身份证 | 最终国家/地区代码 | 最后一年 |
---|---|---|
101 | 美国 | 2023 |
102 | CAN | 2026 |
这里有一些选项如何执行此操作...
首先我们可以使用
GREATEST
来获取这两年中较大的一个。
然后我们可以例如
JOIN
表格本身并检查是否没有其他行具有相同的 id 具有更大的年份。
我评论了查询中的步骤:
SELECT
main.id, main.country_code,
GREATEST(main.end_year, main.complete_year) AS finalYear # take the max of the two years
FROM yourtable main
LEFT JOIN yourtable sub # self JOIN on the id
ON main.id = sub.id
AND GREATEST(main.end_year, main.complete_year) < # compare the current year to other years of the same id
GREATEST(sub.end_year, sub.complete_year)
WHERE sub.id is NULL; # check there is no greater year for the current id
获得所需结果的另一种选择是使用
CTE
。
首先我们获取每个 id 及其最近年份:
SELECT
id, MAX(GREATEST(end_year, complete_year)) AS finalYear
FROM yourtable
GROUP BY id;
然后我们使用
IN
或 JOIN
检查表中哪些行具有正确的 id 和年份。
这里与
IN
:
WITH maxData AS
(SELECT
id, MAX(GREATEST(end_year, complete_year)) AS finalYear
FROM yourtable
GROUP BY id)
SELECT
id, country_code, GREATEST(end_year, complete_year) AS finalYear
FROM yourtable
WHERE (id, GREATEST(end_year, complete_year))
IN (SELECT id, finalYear FROM maxData);
这里与
JOIN
:
WITH maxData AS
(SELECT
id, MAX(GREATEST(end_year, complete_year)) AS finalYear
FROM yourtable
GROUP BY id)
SELECT
y.id, y.country_code, GREATEST(y.end_year, y.complete_year) AS finalYear
FROM yourtable y
INNER JOIN maxData d
ON y.id = d.id
AND GREATEST(y.end_year, y.complete_year) = d.finalYear;
很难说哪种方法是最好的方法以及它是否真的会产生重要的影响。我认为使用
CTE
的选项更具可读性,但这只是我的“品味”。