我有一个返回这些记录的视图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
我该怎么做?
谢谢!!!
答案 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)