SQL:如何按国家/地区选择最新值

问题描述 投票:-1回答:5

我有一个包含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查询?

谢谢您的帮助。

sql date distinct
5个回答
0
投票

您可以使用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;

0
投票

另一种方法是使用窗口函数(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;

0
投票

我理解这个问题,因为您想要所有国家/地区的最新值,因为该国家/地区可以在表格中重复(?):]

    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 

我测试了它,并且可以正常工作。


0
投票

假设日期列的类型是日期。在子查询中,您可以找到(国家/地区,最大日期)的元组,并添加值,您可以按照注释中的说明进行加入,也可以使用IN


-1
投票

您可以使用以下查询:只需将TABLE_NAME替换为表格名称即可。


-1
投票

您可以使用以下查询:只需将TABLE_NAME替换为表格名称即可。

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