我有一张这样的表:
rowInt Value
2 23
3 45
17 10
9 0
....
列rowInt值是整数但不是具有相同增量的序列。我可以使用以下sql按rowInt列出值:
SELECT * FROM myTable ORDER BY rowInt;
这将按rowInt列出值。如何获得两行之间的Value的差异,结果如下:
rowInt Value Diff
2 23 22 --45-23
3 45 -35 --10-45
9 0 -45 --0-45
17 10 10 -- 10-0
....
该表位于SQL 2005(Miscrosoft)
中答案 0 :(得分:54)
SELECT
[current].rowInt,
[current].Value,
ISNULL([next].Value, 0) - [current].Value
FROM
sourceTable AS [current]
LEFT JOIN
sourceTable AS [next]
ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)
编辑:考虑一下,在select(ala Quassnoi的回答)中使用子查询可能会更有效率。我会试用不同的版本,然后查看执行计划,看看哪个版本对你拥有的数据集的性能最佳...
答案 1 :(得分:25)
SELECT rowInt, Value,
COALESCE(
(
SELECT TOP 1 Value
FROM myTable mi
WHERE mi.rowInt > m.rowInt
ORDER BY
rowInt
), 0) - Value AS diff
FROM myTable m
ORDER BY
rowInt
答案 2 :(得分:11)
如果你真的想确定订单,请使用“Row_Number()”并比较当前记录的下一条记录(仔细查看“on”子句)
T1.ID + 1 = T2.ID
您基本上使用当前行加入下一行,而不指定“min”或执行“top”。如果您有少量记录,“Dems”或“Quassanoi”的其他解决方案将正常工作。
with T2 as (
select ID = ROW_NUMBER() over (order by rowInt),
rowInt, Value
from myTable
)
select T1.RowInt, T1.Value, Diff = IsNull(T2.Value, 0) - T1.Value
from ( SELECT ID = ROW_NUMBER() over (order by rowInt), *
FROM myTable ) T1
left join T2 on T1.ID + 1 = T2.ID
ORDER BY T1.ID
答案 3 :(得分:9)
SQL Server 2012及更高版本支持LAG / LEAD函数可访问上一行或后续行。 SQL Server 2005不支持此功能(在SQL2005中,您需要连接或其他内容)。
有关此数据的SQL 2012示例
/* Prepare */
select * into #tmp
from
(
select 2 as rowint, 23 as Value
union select 3, 45
union select 17, 10
union select 9, 0
) x
/* The SQL 2012 query */
select rowInt, Value, LEAD(value) over (order by rowInt) - Value
from #tmp
LEAD(value)将返回" over"中给定顺序的下一行的值。条款。
答案 4 :(得分:2)
SQL Server是否支持分析功能?
select rowint,
value,
value - lag(value) over (order by rowint) diff
from myTable
order by rowint
/
答案 5 :(得分:0)
select t1.rowInt,t1.Value,t2.Value-t1.Value as diff
from (select * from myTable) as t1,
(select * from myTable where rowInt!=1
union all select top 1 rowInt=COUNT(*)+1,Value=0 from myTable) as t2
where t1.rowInt=t2.rowInt-1
答案 6 :(得分:0)
查询以查找单列的2行之间的日期差异
SELECT
Column name,
DATEDIFF(
(SELECT MAX(date) FROM table name WHERE Column name < b. Column name),
Column name) AS days_since_last
FROM table name AS b
答案 7 :(得分:0)
我只是为此做一个小功能。输入两个值,您需要知道两者之间的差异,并从较大的值中减去较小的值。像这样:
CREATE FUNCTION [dbo].[NumDifference]
( @p1 FLOAT,
@p2 FLOAT )
RETURNS FLOAT
AS
BEGIN
DECLARE @Diff FLOAT
IF @p1 > @p2 SET @Diff = @p1 - @p2 ELSE SET @Diff = @p2 - @p1
RETURN @Diff
END
在查询中获取a列与b列之间的差异:
SELECT a, b, dbo.NumDifference(a, b) FROM YourTable