选择 MIN 日期之后的第一个日期
Posted
技术标签:
【中文标题】选择 MIN 日期之后的第一个日期【英文标题】:Selecting the first date after the MIN date 【发布时间】:2017-02-22 18:34:33 【问题描述】:这个站点为我回答了许多 SQL 问题。终于注册问我自己的一个并在这里活跃起来。
无论如何,我正在使用具有 Date_Effective 和 Date_Lapse 的表。一个客户端可以有多行,所以我想要得到的是同一客户端的 Date_Lapse 和下一个 Date_Effective 之间的天数。此表中的日期值是 int,稍后我将转换为日期。
下面的代码不起作用。它不喜欢我加入的第二个价值观。为什么我不能让它给我比每个 date_effective 大的 min date_effective?如果我运行以下命令,我将不会得到任何结果,因为它会看到它,因为没有大于最小生效日期的生效日期。
SELECT ClientID, c1.Date_Lapse, c2.Date_Effective
FROM Fact_Episodes c1
LEFT JOIN (
SELECT ClientID, min(Date_Effective) as Date_Effective
FROM Fact_Episodes
GROUP BY ClientID
) c2
ON c1.ClientID = c2.ClientID
AND c2.Date_Effective > c1.Date_Effective
【问题讨论】:
在我以这种方式尝试之前,我试图通过分区的行号让它工作,但我无法得到它,所以那是我开始尝试自己的日期,现在在我发布这个之后我当然知道我的分区做错了什么哈哈谢谢。 【参考方案1】:如果您想坚持使用左连接,这会起作用。
select c1.ClientID, c1.Date_Lapse, min(c2.Date_Effective) as Date_Effective
from Fact_Episodes c1
left join Fact_Episodes c2
on c1.ClientID = c2.ClientID
and c2.Date_Effective > c1.Date_Effective
group by c1.ClientId, c1.Date_Lapse
【讨论】:
@TimMullender 乐于助人!c2
的子查询在 mysql 中是不必要且不可取的。
@GordonLinoff 在您发布更好的解决方案让 Tim 接受之前,我无法删除它。请做
@SqlZim 。 . .我只是建议您编辑答案。你的回答是合理和正确的。 . .只是因为 MySQL 实现子查询的方式效率较低。
@SQLZim 。 . .我相信 MySQL 总是在 FROM
子句中实现子查询。这会在写入数据时产生开销。更重要的是,它阻止了索引(和分区)的使用。 “相信”是因为最新版本的 MySQL 可能正在改进底层引擎。以上是关于选择 MIN 日期之后的第一个日期的主要内容,如果未能解决你的问题,请参考以下文章
select * from [table] where min(date) > 某个日期
在 SQL redshift 中返回特定周的第一个日期(星期日)
如何将 Angular 日期范围选择器中的日期设置为该月的第一天