Как использовать MYSQL для включения отсутствующих строк в итоговую таблицу со значениями по умолчанию 0 для всех столбцов?

#mysql #sql #datetime #greatest-n-per-group #window-functions

#mysql — сервер #sql #дата и время #наибольшее число на группу #окно-функции #mysql

Вопрос:

Изображение всех таблиц

Этот вопрос является частью более крупного запроса MySQL, который у меня есть. Итак, у меня есть таблица «идентификаторов игроков», «дат», «результатов» и «проблем». Это таблица T0 на прилагаемом изображении. Я запускаю SQL-запрос к нему, чтобы получить самую последнюю строку для всех игроков, где ‘date’ равен <= (2020-08-14 — 7days). Не у всех игроков будет строка с датой, удовлетворяющая этому условию, поэтому, естественно, эти строки PlayerID не появятся в результирующей таблице (таблица T1 на рисунке).

Теперь то, что я хочу сделать, это включить эти недостающие строки со значениями 0 для ‘score’ и ‘problems’ в результирующую таблицу (см. Таблицу T2 на рисунке). Я совершенно не понимаю, как это сделать, поскольку я очень новичок в SQL-запросах.

Вот часть SQL-запроса, которая создает таблицу T1 из T0, но я хочу изменить ее таким образом, чтобы она создавала таблицу T2 из T0:

 select *
from (
   select *, row_number() over (partition by playerId order by date desc) as ranking
   from player
   where date<=date_add(date('2020-08-14'),interval -7 day)
) t
where t.ranking = 1
  

Ответ №1:

Один из вариантов использует подзапрос для перечисления всех игроков, а затем выводит ваш текущий результирующий набор с left join :

 select p.playerId, t.date, coalesce(t.score, 0) score, coalesce(t.problem, 0) problem
from (select distinct playerId from player) p
left join (
   select p.*, row_number() over (partition by playerId order by date desc) as rn
   from player p
   where date <= '2020-08-14' - interval 7 day
) t on t.playerId = p.playerId and t.rn = 1
  

Если у вас есть ссылочная таблица для всех игроков, вы можете просто заменить select distinct подзапрос этой таблицей.

Комментарии:

1. это именно то, чего я хотел. спасибо вам оооочень большое !!!!!!! 😀