#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. это именно то, чего я хотел. спасибо вам оооочень большое !!!!!!! 😀