1

我有一个包含 3 个字段的表。IE

id, transferdate, placeid
---------------------------
1  | 1-4-2014 | 14 
2  | 4-4-2014 | 14 
5  | 10-4-2014| 14 
6  | 1-5-2013 | 13 
9  | 10-6-2013| 12

我想要实现的目标......如果可能......使用单个查询(无论有多少子查询)但普通 SQL(没有枢轴,CTE 等)是得到相同的:placeid's transferdate from each row, on the previous行或下一行,以便我可以用它们进行一些计算。我的意思是 :

 id, transferdate, placeid, nexttransferdate
    --------------------------------------------
    1  | 1-4-2014 | 14        | 4-4-2014        
    2  | 4-4-2014 | 14        | 10-4-2014 
    5  | 10-4-2014| 14        | null (or transferdate)
    6  | 1-5-2013 | 13        | null (or transferdate)
    9  | 10-6-2013| 12        | null (or transferdate)

我已经使用存储过程或函数中的游标甚至使用临时表来实现它,并且我知道如何使用内置递归函数(即 Oracle)来实现它,但我的问题是我需要将它用作报告中的子查询SQL 语句,因此它必须是纯 SQL 代码作为一个语句。

谢谢您的回答

4

2 回答 2

3

查看前几行的 SQL 标准函数是 LAG,查看后几行的 SQL 标准函数是 LEAD。但是,它们并非在每个 dbms 中都可用。只需查一下,它们是否可用。

如果不是:下一个值始终是所有较大值中的最小值,前一个值是所有较小值中的最大值。这应该可以帮助您构建查询。

编辑:这是一个没有 LEAD 的简单查询:

select 
  id,
  transferdate,
  placeid,
  (
    select min(transferdate)
    from transfers latertransfers
    where latertransfers.placeid = transfers.placeid
    and latertransfers.transferdate > transfers.transferdate
  ) as nexttransferdate
from transfers
order by id;

编辑:这是 LEAD 版本。从版本 8.1.6 开始在 Oracle 中可用。

select 
  id,
  transferdate,
  placeid,
  lead(transferdate) over (partition by placeid order by transferdate) as nexttransferdate
from transfers
order by id;
于 2014-09-04T14:07:12.000 回答
1

您可以通过自联接和聚合来做到这一点:

select t.id, t.transferdate, t.placeid, min(t.transferdate)
from table t left join
     table tnext
     on tnext.placeid = t.placeid and tnext.transferdate > t.transferdate
group by t.id, t.transferdate, t.placeid;

也就是说,我不建议实际使用此查询。在几乎每个数据库中,都有更好的方法。

于 2014-09-04T14:14:51.483 回答