SQL : 如何 select 按国家/地区分类的最新值

SQL : How to select the most recent value by country

我有一个包含 3 列的 table:天、国家、值。不同日期的国家/地区有许多值。例如:

  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

我想select按国家/地区分类的最新值。例如:

  DAY            COUNTRY       VALUE 
  04-SEP-19      BELGIUM        2124
  18-JUL-19      SPAIN          1724
  26-MAR-19      ITALY          4141

我可以使用的 sql 查询是什么?

感谢您的帮助。

您可以使用以下查询: 只需将 TABLE_NAME 替换为您的 table.

的名称
 SELECT 
    COUNTRY,
    VALUE,
    MAX(DATE) AS "MostRecent"
FROM TABLE_NAME
GROUP BY COUNTRY;

假设日期列的类型是日期。 在子查询中,您可以找到 (country, max date) 的元组并添加值,您可以按照评论中提到的方式加入或使用 IN

SELECT DISTINCT day, country, value
FROM yourTable
WHERE (country, day)
in (
    SELECT country, MAX(day) as day
    FROM yourTable
    GROUP BY country, value
)

我理解这个问题,因为您想要所有国家/地区的最新值,因为国家/地区可以在 table(?):

中重复
    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 

我测试了它并且有效。

您可以使用 row_number() window 函数(如果您的 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;

另一种方法是使用 window 函数(SQL 服务器,MySQL8 等)

例如

ROW_NUMBER() OVER ( PARTITION BY COUNTRY ORDER BY CONVERT(DATE, [Day]) DESC )

然后就过滤到这个函数所在的地方returns1

完整示例:

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;