Следующее поведение смутило меня, хотя я считаю, что имею опыт работы с базами данных. У меня есть 2 таблицы, одна для стран и одна для случаев covid на страну на дату. В основном они ...

0
Ivica Pesovski 10 Фев 2021 в 02:04

2 ответа

Лучший ответ

Если вы используете MariaDB 10.2 или более поздней версии, вы можете использовать ROW_NUMBER() в CTE, чтобы получить данные о последних обращениях для каждого country_id, затем их можно присоединить к countries, чтобы получить страну имя:

WITH latest AS (
  SELECT *,
         ROW_NUMBER() OVER (PARTITION BY country_id ORDER BY date DESC) AS rn
  FROM cases
)
SELECT c.name, l.active_cases, l.date
FROM latest l
JOIN countries c ON c.id = l.country_id
WHERE l.rn = 1

Выход:

name        active_cases    date
Argentina   30              2021
Brazil      300             2021
Cuba        3000            2021
Ecuador     30000           2021

Демо на dbfiddle

3
Nick 9 Фев 2021 в 23:31

Ваш внутренний запрос группируется по country_id и сортируется по DESC. Тот факт, что он дает вам все результаты из 2021 в вашем примере, является случайным на основе данных в вашей таблице. Вот почему ваш объединенный запрос возвращает неожиданные данные.

Если вы ищете новейшие случаи, вам следует добавить явный ORDER BY к своему внутреннему запросу, примерно так:

SELECT countries.*, active_cases, date
FROM countries
JOIN (
  SELECT cases.country_id, active_cases, date
  FROM cases
  JOIN (
    SELECT country_id, MAX(date) as target_date
    FROM cases
    GROUP BY country_id 
  ) as latest
    ON cases.country_id = latest.country_id
      AND cases.date = latest.target_date
) as latest_cases
  ON countries.id = latest_cases.country_id;
  

Изменить: замена на запрос с использованием вложенных подзапросов, но приведенный выше ответ работает с более чистыми разделами строк.

1
R Ma 9 Фев 2021 в 23:34
66128558