mysql - 如何使用 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
解决方案
一个选项使用子查询列出所有玩家,然后将您当前的结果集与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
用那个表替换子查询。
推荐阅读
- python - SQLAlchemy - 从列表中查找关系包含至少一个元素的项目
- survival-analysis - 我应该如何在 Kaplan Meier 生存分析中报告时变协变量的“组合风险比”
- dns - 我可以拥有一个只有一个名称而没有 .com 或任何结尾的域名吗
- grafana - 在 Grafana 上格式化长数字
- php - PHP、FTP和源代码控制系统
- python - 找到两个相交的凸包的内点
- authentication - 在 Blazor 中配置基于策略的授权
- xml - REST API (XML):执行复制时出现 400 错误请求(缺少复制源)
- wpf - 如何使用多数据触发器有条件地更改不同控件的不透明度
- linux - awk 命令执行 2 列的除法并获得高于某个值的结果