如果有匹配则输出相邻列的 CASE 语句 (SQL)

问题描述 投票:0回答:1

我正在编写一个查询,并希望创建一个执行以下操作的 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
sql mysql case
1个回答
0
投票

这里有一些选项如何执行此操作...

首先我们可以使用

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
的选项更具可读性,但这只是我的“品味”。

在此 fiddle 示例中尝试上述查询

© www.soinside.com 2019 - 2024. All rights reserved.