使用差距和孤岛知识找到最长时间不改变就业(SQL)

Posted

技术标签:

【中文标题】使用差距和孤岛知识找到最长时间不改变就业(SQL)【英文标题】:Using gap and island knowledge to find longest time without change in employment (SQL) 【发布时间】:2021-04-09 23:10:38 【问题描述】:

我正在处理的问题:

公司员工没有变化的最长时间是多少。工作变动是指新员工或现有员工离开公司。

该表包含员工 id、start_date、end_date、员工姓名。

我在尝试开始查询时遇到了困难。我查找了一些差距和岛屿信息,但仍然卡住了。任何人都有我可以解析以更好地理解这个概念的解决方案?

Question

【问题讨论】:

请提供样本数据、所需结果和适当的数据库标签。 将您的示例数据和预期结果显示为格式化文本(而非图像),并展示您的尝试。 【参考方案1】:

这解决了问题的原始版本。

如果您想要最长的时间段没有变化,那么您想要取消透视日期并使用lead()lag()。像这样的:

with dates as (
      select start_date as dte
      from t
      union   -- on purpose to remove duplicates
      select end_date
      from t
     )
select (next_dte - dte)
from (select d.*, lead(dte) over (order by dte) as next_dte
      from dates d
     ) d
order by (next_dte - dte) desc
fetch first one row only;

当然,逻辑的确切语法可能取决于您的数据库,但这让您知道该怎么做。

【讨论】:

嗨,戈登,感谢您的回答。这有助于我更深入地研究这个问题。诚然,我的 SQL 技能相当新,而且我缺乏对基本概念的理解。我已经编辑了帖子以包含确切的问题。没有指定数据库,我更关心学习概念。您能否为我提供完整的答案,以便我可以开始搜索您正在使用的功能并通过向后工作将其拼凑起来?再次感谢您的帮助。

以上是关于使用差距和孤岛知识找到最长时间不改变就业(SQL)的主要内容,如果未能解决你的问题,请参考以下文章

差距和孤岛 - Microsoft Access

SQL Server - 计算会话数 - 差距和孤岛

令人费解的差距和孤岛 ORACLE SQL

SQL 差距和孤岛问题与扭曲 - 根据前一个标志的持续时间重置标志

具有开始和结束日期的差距和孤岛(有效期)

差距和孤岛问题 - 查询不适用于所有时期