如何在两列中获取具有最大值的行
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
我想知道如何通过从两列中获取最大值来过滤 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