Выберите все значения с последней даты, которая является общей для строк - PullRequest
0 голосов
/ 28 мая 2020

У меня есть таблица Postgresql с подсчетом стран в динамике. Не в каждой стране есть счетчик для каждой даты, а в некоторых есть значения NULL. Я хотел бы получить подсчеты для каждой страны до последней даты в каждой стране есть данные для , исключая значения NULL.

Я сделал DB Fiddle с данными примера .

Пример:

country date        count  id
Germany 2020-05-25  10     1
Germany 2020-05-26  11     2
Germany 2020-05-27  12     3
Germany 2020-05-28  13     4
Italy   2020-05-25  20     5
Italy   2020-05-26  21     6
Italy   2020-05-27  22     7
Italy   2020-05-28  23     8
France  2020-05-25  30     9
France  2020-05-26  31     10
France  2020-05-27  NULL   11

Я бы хотел получить следующее:

country date        count  id
Germany 2020-05-25  10     1
Germany 2020-05-26  11     2
Italy   2020-05-25  20     5
Italy   2020-05-26  21     6
France  2020-05-25  30     9
France  2020-05-26  31     10

Я искал, но я относительно новичок на SQL и, похоже, не знает, по каким ключевым словам искать.

1 Ответ

2 голосов
/ 28 мая 2020

Вы можете использовать оконные функции для подсчета количества строк с датами, а затем сравнения с количеством стран:

SELECT c.*
FROM (SELECT c.*, COUNT(count) over (partition by date) as num_countries_on_date
      FROM countries c
     ) c
WHERE num_countries_on_date = (SELECT  COUNT(DISTINCT c2.country) FROM countries c2);

Здесь - это скрипт db <>.

Если вы хотите сгенерировать данные для диапазона дат - своего рода противоположная проблема - вы можете использовать CROSS JOIN для генерации строк, LEFT JOIN для ввода данных и COALESCE() чтобы превратить NULL в 0:

SELECT c.country, d.date, coalesce(co.count, 0) as count
FROM (SELECT DISTINCT country FROM countries) c CROSS JOIN
     generate_series('2020-05-26'::date, '2020-05-27'::date, interval '1 day') d(date) LEFT JOIN
     countries co
     ON co.country = c.country AND co.date = d.date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...