SQL: Как выбрать самое последнее значение по стране - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть таблица с 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 я могу использовать?

Спасибо за помощь.

Ответы [ 5 ]

0 голосов
/ 03 февраля 2020

Другой способ сделать это - использовать оконную функцию (SQL Server, MySQL8 и т. Д. c)

например,

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 голосов
/ 03 февраля 2020

Вы можете использовать оконную функцию row_number() (если ваша СУБД поддерживает ее)).

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 голосов
/ 03 февраля 2020

Предположим, что тип столбца дня - дата. В подзапросе вы можете найти кортеж (страна, максимальная дата) и добавить значение, вы можете присоединиться, как указано в комментариях, или использовать IN

SELECT DISTINCT day, country, value
FROM yourTable
WHERE (country, day)
in (
    SELECT country, MAX(day) as day
    FROM yourTable
    GROUP BY country, value
)
0 голосов
/ 03 февраля 2020

Я понимаю проблему, поскольку вам нужно самое последнее значение для всех стран, поскольку страна может повторяться в таблице (?):

    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 голосов
/ 03 февраля 2020

Вы можете использовать следующий запрос: просто замените TABLE_NAME именем вашей таблицы.

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