如何在两列中获取具有最大值的行

How do I get rows with max values across two columns

我想知道如何通过从两列中获取最大值来过滤 table。这是一个简化的输入 table。我想要每人一行,其中有 max(year) 和 max(version)

Name Year Version Value
a 2017 1 100
a 2018 4 101
a 2018 5 102
b 2017 1 201
b 2017 2 202
b 2017 3 203
b 2016 2 204

我要取回的是年份最高的行,然后是年份最高、版本最高的行。

Name Year Version Value
a 2018 5 102
b 2017 3 203

我使用了以下代码并得到了最近年份的 table。但是我每年都有多个不同版本号的条目。如何仅使用最新版本号进一步清除它。

SELECT A.NAME, A.YEAR, A.VERSION, A.VALUE
FROM TABLE A
INNER JOIN (
    SELECT NAME, MAX(YEAR) AS YEAR
    FROM TABLE
    GROUP BY NAME
) B ON A.NAME = B.NAME AND A.YEAR = B.YEAR

谢谢。

撇开性能不谈,这个通用的 SQL 应该可以做到:

SELECT *
FROM t
WHERE NOT EXISTS (
    -- select rows for that person-year-version
    -- where year is greater or (year is same and version is greater)
    SELECT 1
    FROM t AS x
    WHERE x.Name = t.Name AND (
        x.Year > t.Year OR (
            x.Year = t.Year AND x.Version > t.Version
        )
    )
)

如果 window(分析)函数可用,则只需使用此查询:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Year DESC, Version DESC) AS rn
    FROM t
) AS x
WHERE rn = 1