Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取一个值和先前值之间的差值_Sql Server_Sql Server 2008_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server 获取一个值和先前值之间的差值

Sql server 获取一个值和先前值之间的差值,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,我有一个从不同表中提取数据的查询,结果集如下 当前结果集 此外,为了使这些列的读数为1、2和3,我希望在读数和之前的读数之间有区别。我希望我的结果集看起来像这样 期望结果集 在计算R1_Change1的结果集中,我取 44 - 38 = 6 38 - 46 = -8 46 - 17 = 17 17 - 25 = -8 等等。。。。请提前通知我谢谢。。我已经为测试数据添加了代码,请查看并提出建议。到目前为止,我得到的答案没有达到预期的效果,但也没有达到预期的效果 CREATE TABLE

我有一个从不同表中提取数据的查询,结果集如下

当前结果集

此外,为了使这些列的读数为1、2和3,我希望在读数和之前的读数之间有区别。我希望我的结果集看起来像这样

期望结果集

在计算R1_Change1的结果集中,我取

44 - 38 =  6
38 - 46 = -8
46 - 17 = 17
17 - 25 = -8 
等等。。。。请提前通知我谢谢。。我已经为测试数据添加了代码,请查看并提出建议。到目前为止,我得到的答案没有达到预期的效果,但也没有达到预期的效果

CREATE TABLE TestTable
(
[Date] DateTime,
Reading1 int,
Reading2 int,
Reading3 int
)
GO

INSERT INTO TestTable
VALUES ('2013-10-01 00:00:00.000',44,27,22),
('2013-09-17 00:00:00.000',38,55,54),
('2013-09-11 00:00:00.000',46,63,65),
('2013-09-03 00:00:00.000',17,96,23),
('2013-08-21 00:00:00.000',25,87,54),
('2013-08-11 00:00:00.000',63,25,25)
GO

试试这样的-

select
[Date],
[Reading1],
R1_Change = [Reading1] - (select top 1 [Reading1] from Readings b where b.[Date] < a.[Date] order by b.[Date] desc),
[Reading2],
R2_Change = [Reading2] - (select top 1 [Reading2] from Readings b where b.[Date] < a.[Date] order by b.[Date] desc),
[Reading3],
R3_Change = [Reading3] - (select top 1 [Reading3] from Readings b where b.[Date] < a.[Date] order by b.[Date] desc),
from
Readings a

试试这样的-

select
[Date],
[Reading1],
R1_Change = [Reading1] - (select top 1 [Reading1] from Readings b where b.[Date] < a.[Date] order by b.[Date] desc),
[Reading2],
R2_Change = [Reading2] - (select top 1 [Reading2] from Readings b where b.[Date] < a.[Date] order by b.[Date] desc),
[Reading3],
R3_Change = [Reading3] - (select top 1 [Reading3] from Readings b where b.[Date] < a.[Date] order by b.[Date] desc),
from
Readings a
这应该做到:

;WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(ORDER BY [Date])
    FROM (/*Your query here*/) A
)
SELECT  X.[Date],
        X.Reading1,
        ISNULL(X.Reading1,0) - ISNULL(Y.Reading1,0) R1_Change1,
        X.Reading2,
        ISNULL(X.Reading2,0) - ISNULL(Y.Reading2,0) R2_Change2,
        X.Reading3,
        ISNULL(X.Reading3,0) - ISNULL(Y.Reading3,0) R3_Change3
FROM CTE X
LEFT JOIN CTE Y
    ON X.RN = Y.RN + 1
这应该做到:

;WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(ORDER BY [Date])
    FROM (/*Your query here*/) A
)
SELECT  X.[Date],
        X.Reading1,
        ISNULL(X.Reading1,0) - ISNULL(Y.Reading1,0) R1_Change1,
        X.Reading2,
        ISNULL(X.Reading2,0) - ISNULL(Y.Reading2,0) R2_Change2,
        X.Reading3,
        ISNULL(X.Reading3,0) - ISNULL(Y.Reading3,0) R3_Change3
FROM CTE X
LEFT JOIN CTE Y
    ON X.RN = Y.RN + 1

感谢您抽出时间回复,但您的查询并不遥远,但它显示了错误的结果。请你自己尝试一下,看看是否可以再调整一下以得到正确的结果。您的查询已将结果按升序排列,然后从新值中减去旧值。而我希望从旧值中找到新值。我已经在我的问题中添加了创建表和值,请您自己尝试,并建议谢谢。@MuhammedAli所需的更改似乎很简单,只需将连接条件从X.RN=Y.RN-1更改为X.RN=Y.RN+1即可。更新了我的答案拉拉马克的作品很有魅力谢谢你的快速回复,朋友,非常感谢感谢您抽出时间回复,但您的查询并不遥远,但它显示了错误的结果。请你自己尝试一下,看看是否可以再调整一下以得到正确的结果。您的查询已将结果按升序排列,然后从新值中减去旧值。而我希望从旧值中找到新值。我已经在我的问题中添加了创建表和值,请您自己尝试,并建议谢谢。@MuhammedAli所需的更改似乎很简单,只需将连接条件从X.RN=Y.RN-1更改为X.RN=Y.RN+1即可。更新了我的答案拉拉马克的作品很有魅力谢谢你的快速回复,朋友,非常感谢