首页 > 解决方案 > 如何使用 MYSQL 在最终表中包含所有列的默认值为 0 的缺失行?

问题描述

所有桌子的图片

这个问题是我拥有的更大的 mySQL 查询的一部分。所以我有一个'playerIds'、'dates'、'scores'和'problems'表格。它是附件图像中的表 T0。我正在对其运行 SQL 查询,以获取“日期”<= (2020-08-14 - 7days) 的所有玩家的最新行。并非所有玩家都有满足该条件的日期的行,因此这些 playerId 行自然不会出现在结果表中(图中的表 T1)。

现在我想要做的是在结果表中包含那些缺失值为 0 的“分数”和“问题”的行(参见图片中的表 T2)。因为我对 SQL 查询非常陌生,所以我完全不知道如何去做。

这是从 T0 生成表 T1 的 SQL 查询的一部分,但我想对其进行修改,使其从 T0 生成表 T2:

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

标签: mysqlsqldatetimegreatest-n-per-groupwindow-functions

解决方案


一个选项使用子查询列出所有玩家,然后将您当前的结果集与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用那个表替换子查询。


推荐阅读