我有一个包含3列的表格:日期,国家/地区,值。不同国家/地区的日期有很多值。例如:
DAY COUNTRY VALUE
04-SEP-19 BELGIUM 2124
15-MAR-19 BELGIUM 2135
21-MAY-19 SPAIN 1825
18-JUL-19 SPAIN 1724
26-MAR-19 ITALY 4141
我想按国家/地区选择最新值。例如:
DAY COUNTRY VALUE
04-SEP-19 BELGIUM 2124
18-JUL-19 SPAIN 1724
26-MAR-19 ITALY 4141
我可以使用什么SQL查询?
谢谢您的帮助。
您可以使用row_number()
窗口功能(如果您的DBMS支持)。
SELECT x.day,
x.country,
x.value
FROM (SELECT t.day,
t.country,
t.value,
row_number() OVER (PARTITION BY t.country
ORDER BY t.day DESC) rn
FROM elbat t) x
WHERE x.rn = 1;
另一种方法是使用窗口函数(SQL Server,MySQL8等)
例如
ROW_NUMBER() OVER ( PARTITION BY COUNTRY ORDER BY CONVERT(DATE, [Day]) DESC )
然后仅过滤到此函数返回1的位置
完整示例:
WITH TestData
AS ( SELECT '04-SEP-19' AS [Day], 'BELGIUM' AS [COUNTRY], 2124 AS [VALUE]
UNION
SELECT '15-MAR-19' AS [Day], 'BELGIUM' AS [COUNTRY], 2135 AS [VALUE]
UNION
SELECT '21-MAY-19' AS [Day], 'SPAIN' AS [COUNTRY], 1825 AS [VALUE]
UNION
SELECT '18-JUL-19' AS [Day], 'SPAIN' AS [COUNTRY], 1724 AS [VALUE]
UNION
SELECT '26-MAR-19' AS [Day], 'ITALY' AS [COUNTRY], 4141 AS [VALUE] ),
TestDataRanked
AS ( SELECT *,
ROW_NUMBER() OVER ( PARTITION BY COUNTRY ORDER BY CONVERT(DATE, [Day]) DESC ) AS SelectionRank
FROM TestData )
SELECT [Day],
COUNTRY,
[VALUE]
FROM TestDataRanked
WHERE SelectionRank = 1;
我理解这个问题,因为您想要所有国家/地区的最新值,因为该国家/地区可以在表格中重复(?):]
select distinct t1.DAY, t1.COUNTRY, t1.VALUE FROM day_test t1 inner join day_test t2 on t1.day in (select max(day) from day_test t3 where t1.country = t3.country ) and t1.country = t2.country
我测试了它,并且可以正常工作。
假设日期列的类型是日期。在子查询中,您可以找到(国家/地区,最大日期)的元组,并添加值,您可以按照注释中的说明进行加入,也可以使用IN
您可以使用以下查询:只需将TABLE_NAME
替换为表格名称即可。
您可以使用以下查询:只需将TABLE_NAME
替换为表格名称即可。