首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -需要为提供的开始日期确定隐式结束日期

SQL -需要为提供的开始日期确定隐式结束日期
EN

Stack Overflow用户
提问于 2011-03-04 22:51:43
回答 1查看 76关注 0票数 1

请考虑以下几点:

代码语言:javascript
复制
CREATE TABLE Members 
(
    MemberID CHAR(10)
    , GroupID CHAR(10)
    , JoinDate DATETIME
)

INSERT Members VALUES ('1', 'A', 2010-01-01)
INSERT Members VALUES ('1', 'C', 2010-09-05)
INSERT Members VALUES ('1', 'B', 2010-04-15)
INSERT Members VALUES ('1', 'B', 2010-10-10)
INSERT Members VALUES ('1', 'A', 2010-06-01)
INSERT Members VALUES ('1', 'D', 2001-11-30)

从该表中进行选择的最佳方法是什么,确定隐含的"LeaveDate",生成以下数据集:

代码语言:javascript
复制
MemberID GroupID JoinDate    LeaveDate
1        A       2010-01-01  2010-04-14
1        B       2010-04-15  2010-05-31
1        A       2010-06-01  2010-09-04
1        C       2010-09-05  2010-10-09
1        B       2010-10-10  2010-11-29
1        D       2010-11-30  NULL

正如你所看到的,一个成员被认为在成员资格上没有失效。假设每个成员状态周期的LeaveDate是可以在不同组中为该成员找到的下一个按时间顺序排列的JoinDate的前一天。当然,这是对我的实际问题的简化说明,它包括两个更多的分类/分组列和数千个不同的成员,这些成员的JoinDate值没有特定的顺序存储。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-04 23:04:24

也许是这样的东西?自加入,然后选择晚于当前行的加入日期的最小加入日期,即休假日期加1。从上面减去一天。

您可能需要调整特定RDBMS的日期算法。

代码语言:javascript
复制
SELECT
      m1.*
    , MIN( m2.JoinDate ) - INTERVAL 1 DAY AS LeaveDate
FROM
    Members m1
LEFT JOIN
    Members m2
ON    m2.MemberID = m1.MemberID
AND   m2.JoinDate > m1.JoinDate
GROUP BY
      m1.MemberID
    , m1.GroupID
    , m1.JoinDate
ORDER BY
      m1.MemberID
    , m1.JoinDate
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5195263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档