计算SQL中以下记录之间的距离

时间:2014-06-03 11:11:31

标签: mysql sql

我有一个返回这些记录的视图X:

ID   Value
1    8
2    20
3    24
4    80

我需要计算每个记录值与其后续记录之间的距离。在最后一条记录中,(id = 4)我应该插入默认距离100。 所以我做了这个查询:

SELECT a.ID , (a.Value-b.Value) as DistanceToNextRecord
from X as a cross join X as b ON ( a.ID = b.ID-1) 

得到了:

ID  DistanceToNextRecord
1   12
2   4
3   56

但我不知道如何对待最后一条记录。我需要另一行:

4   100

我该怎么做?

谢谢!!!

2 个答案:

答案 0 :(得分:1)

我更喜欢使用相关子查询进行此类计算(除非您的数据库支持lead()

select x.id, x.value,
       (select x2.value
        from x x2
        where x2.id > x.id
        order by x2.id
        limit 1
       ) - x.value as DistanceToNextRecord
from x x;

这将为最后一行返回NULL

编辑:

如果您确定id是连续的,没有间隙,那么您可以修改您的查询以使用left outer join

SELECT a.ID , (a.Value-b.Value) as DistanceToNextRecord
from X a left join
     X b
    ON a.ID = b.ID - 1;

答案 1 :(得分:1)

使用左连接将允许您拉回连接条件中无匹配的最后一行。然后,您可以使用ISNULL将其默认为100

我使用的是SQL Server,但mySQL应该可以做同样的事情。

DECLARE @myView TABLE (ID int, VALUE int)

INSERT INTO @myView VALUES  (1,8)
INSERT INTO @myView VALUES  (2,20)
INSERT INTO @myView VALUES  (3,24)
INSERT INTO @myView VALUES  (4,80)

SELECT a.ID, ISNULL((b.VALUE-a.VALUE),100) AS DistanceToNextRecord
FROM @myView AS a LEFT JOIN @myView AS b ON (a.ID = b.ID-1)