Sql 在列中查找下一个日期值

Sql 在列中查找下一个日期值,sql,Sql,我有一个包含以下列和示例值的大表: ID Ser Reg Date 1 12345 001 1/3/2011 1 12345 001 2/2/2011 1 12345 002 1/3/2011 1 12345 002 2/2/2011 2 23456 001 1/3/2011 2 23456 001 2/7/2011 2 23456 001 3/5/2011 我从上一个post SQL中尝试了此查询-选择下一个日期查询-但没有得

我有一个包含以下列和示例值的大表:

ID  Ser     Reg Date
1   12345   001 1/3/2011
1   12345   001 2/2/2011
1   12345   002 1/3/2011
1   12345   002 2/2/2011
2   23456   001 1/3/2011
2   23456   001 2/7/2011
2   23456   001 3/5/2011
我从上一个post SQL中尝试了此查询-选择下一个日期查询-但没有得到所需的结果:

SELECT 
    mytable.id, 
    mytable.date, 
    ( 
        SELECT 
            MIN(mytablemin.date) 
        FROM mytable AS mytablemin 
        WHERE mytablemin.date > mytable.date 
    ) AS NextDate 
FROM mytable 
这就是我努力实现的目标:

ID     Ser         Reg     curr_Date   prev_Date
1      12345       001     2/2/2011    1/3/2011
1      12345       002     2/2/2011    1/3/2011
2      23456       001     2/7/2011    1/5/2011
2      23456       001     3/5/2011    2/7/2011

我将非常感谢您对这项任务的任何帮助

将mytable的mytablemin副本与mytable连接的相关子查询缺少一个条件。此外,您还可以删除没有NextDate的记录,但如果在组(Id、Ser、Reg)中只存在一条记录,则从结果集中删除该记录可能会产生错误的结果

select * from
(
    SELECT 
        mytable.id, 
        mytable.date, 
        ( 
            SELECT 
                MIN(mytablemin.date) 
            FROM mytable AS mytablemin 
            WHERE mytablemin.date > mytable.date 
              and mytablemin.id = mytable.id
              and mytablemin.Ser = mytable.Ser
              and mytablemin.Reg = mytable.Reg
        ) AS NextDate 
    FROM mytable 
) a
where a.NextDate is not null
下面是使用带聚合的派生表的版本:

SELECT 
    mytable.id, 
    mytable.date, 
    mytablemin.minDate
FROM mytable 
  inner join
  (
    SELECT mytablemin.id,
           mytablemin.Ser,
           mytablemin.Reg,
           MIN(mytablemin.date) minDate
    FROM mytable AS mytablemin 
    group by mytablemin.id,
           mytablemin.Ser,
           mytablemin.Reg
    having MIN(mytablemin.date) is not null
  ) AS mytablemin
    on mytablemin.id = mytable.id
    and mytablemin.Ser = mytable.Ser
    and mytablemin.Reg = mytable.Reg

如果您使用的是oracle数据库(您没有提到过,那么我可以假设任何情况)

然后,您可以为此使用超前和滞后功能/命令

select id,ser, reg, curr_date ,prev_date
from 
(
select id,ser, reg, ser, date curr_date
LEAD(date, 1, 0) OVER (PARTITION BY id,ser, reg, curr_date ORDER BY date DESC NULLS LAST) prev_date,
)
where prev_date is not null;

欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!什么数据库系统,哪个版本??SQL只是结构化查询语言-一种被许多数据库系统使用的语言-SQL不是数据库产品。。。像这样的东西通常是特定于供应商的-所以我们真的需要知道您使用的是什么数据库系统。。。。