选择一条记录,因为它的日期字段在另一个记录日期字段 SQL 之后 X 天

Posted

技术标签:

【中文标题】选择一条记录,因为它的日期字段在另一个记录日期字段 SQL 之后 X 天【英文标题】:Selecting a record because its date field is X days after another records date field SQL 【发布时间】:2020-10-05 14:43:31 【问题描述】:

我有一个带有列的表格 GameData;我的 NBA 数据库中的 GameID、日期、开始时间、持续时间、AteamId、HteamID、Ascore、Hscore、出勤率。它基本上保存着 NBA 比赛的数据。我想选择休息 X 天后特定球队的所有记录。

到目前为止,我无法选择记录 select * from GameData where Date+2 in (Select Date from GameData) and ATeamID = 1030; 但这只是获取特定团队的日期值相隔两天的所有记录,但它不会检查两者之间是否有记录。它应该只选择最后一次玩后 2 天的游戏,而不是只选择游戏后 2 天的游戏,无论中间是否有游戏。

【问题讨论】:

你能提供样本数据和想要的结果吗? 【参考方案1】:

您可以使用union all 对表格进行反透视,为每​​场比赛和每支球队生成一行,然后使用lag() 获得“上一场”比赛的日期,最后使用该信息进行过滤:

select gd.*
from (
    select gd.*, lag(date) over(partition by team order by date) lag_date 
    from (
        select gd.*, ateam team from gamedata gd
        union all
        select gd.*, hteam team from gamedata gd
    ) gd
) gd
where date > lag_date + interval 2 day

【讨论】:

我在 '(partition by team order by date) lag_date from ( select gd.*, ATeamID team from' 附近出现错误 1064 (42000) 是 'date' 指的是日期或我的标题为'Date' 应该是 ateam,hteam 是 ATeamID 和 HTeamID。还有 team 的含义是什么,它是一个临时变量还是指构成 ATeamID 和 HTeamID 的 TeamID。谢谢您的评论 @ThomasBrianTierneyIII:此查询需要 mysql 8.0。在早期版本中,您所要求的实现起来将更具挑战性。 好的,我将 mysql 版本更新为 8,现在可以正常使用了。 lag_date 几乎不会比所选记录早 2 天,但我注意到您说我想要的更具挑战性。我正在考虑将我的一些表导出为 csv 文件,然后尝试创建一个 R 或 python func 来帮助做我想做的事,但我觉得这违背了我制作 sql db 的全部意义。你怎么看@GMB @ThomasBrianTierneyIII:我不明白你的意思。如果您正在运行 MySQL 8.0,则此查询应该可以工作并产生您想要的结果。如果结果不符合预期,您能否提供db<>fiddle 提供示例数据并说明未按预期工作的原因? 更新后你的代码运行没有错误。但是,假设一个团队在第一天打一场比赛,然后在第二天休息,然后在第三天打一场比赛,在第四天打一场比赛。我希望它不计算这种情况,因为球队没有 2 天休息日,但它现在有,因为它不会检查中间是否有比赛进行

以上是关于选择一条记录,因为它的日期字段在另一个记录日期字段 SQL 之后 X 天的主要内容,如果未能解决你的问题,请参考以下文章

ms 根据先前记录的日期访问自动填充日期字段

使用日期时间字段选择昨天的记录

如何在时间戳字段中仅使用日期来选择记录?

SQL中哪个字段类别记录日期和哪个字段类别记录时间

access如何字段上一条记录

oracle SQL 取出每个分组的按照日期最新一条记录,同时还显示每个分组某个字段的总和