SQL:查找下一个最近的日期

时间:2018-06-07 12:05:56

标签: sql

我有这样的表

id | name | registration date
-----------------------------
1  | ABC  |     2018-01-01
2  | DEF  |     2018-01-02
3  | GHI  |     2018-01-06
4  | JKL  |     2018-01-07
5  | MNO  |     2018-01-09 

我想创建一个包含人名,注册日期以及在他之后注册的人姓名的表格。

所以我希望结果表看起来像这样:

name | registration date  | next person
---------------------------------------
ABC  |     2018-01-01     | DEF
DEF  |     2018-01-02     | GHI
GHI  |     2018-01-06     | JKL
JKL  |     2018-01-07     | MNO
MNO  |     2018-01-09     | -

在SQL中实现此目的的最有效方法是什么?

提前谢谢

3 个答案:

答案 0 :(得分:2)

您没有说明您的DBMS,但以下是使用所有modern DBMS支持的窗口函数的ANSI标准SQL

select id, 
       name, 
       registration_date, 
       lead(name) over (order by registration_date) as next_person
from the_table
order by registration_date;

答案 1 :(得分:0)

您需要subquery

select *, (select name 
           from table
           where id > t.id
           order by id
           limit 1
          ) as next_person
from table t;

但是,您没有标记任何DBMS,因此我选择subquerylimit子句,但DBMS中的一些没有限制条款,例如SQL Server所以请改用TOP子句:

在SQL Server中,您可以使用LEAD()函数:

select *, lead(name) over (order by id) as next_person
from table t;

答案 2 :(得分:-1)

尝试此查询,它正在运行。

select 
  t1.name, 
  t1.registration_date as "registration date", 
  if(t2.name is null, '-', t2.name ) as "next person" 
from test as t1
left join test as t2 on t2.registration_date > t1.registration_date
group by t1.id