Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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-使用GUID的日期之间的值之间的差异_Sql_Date_Guid_Between - Fatal编程技术网

SQL-使用GUID的日期之间的值之间的差异

SQL-使用GUID的日期之间的值之间的差异,sql,date,guid,between,Sql,Date,Guid,Between,我有一张像这样的桌子: [日期],[guid],[value int] 数据如下所示: 10/1, id1, 10 10/1, id2, 5 10/2, id1, 12 10/2, id2, 14 10/3, id1, 11 我想返回: 10/1, id1, 2 10/1, id2, 9 10/2, id1, -1 相同ID的匹配,获取第二天而不是下一天的值,使用过去的值,减去 所以10/1,id1,2通过 10/1, id1, 10 10/2, id1, 12 所以我们返回第一天,10

我有一张像这样的桌子:

[日期],[guid],[value int]

数据如下所示:

10/1, id1, 10
10/1, id2, 5
10/2, id1, 12
10/2, id2, 14
10/3, id1, 11
我想返回:

10/1, id1, 2
10/1, id2, 9
10/2, id1, -1
相同ID的匹配,获取第二天而不是下一天的值,使用过去的值,减去

所以10/1,id1,2通过

10/1, id1, 10
10/2, id1, 12 
所以我们返回第一天,10/1,id,id1,以及12-10=2的值

如何通过SQL实现这一点

谢谢

未经测试。 获取从t1连接到协作子查询的所有值,该子查询的唯一目的是查找每个guid的下一个最小日期,该日期高于该guid上的日期。然后再次连接到整组值,并仅限于标识的guid和最小日期,使用此t3值从初始t1设置值中减去

SELECT t1.date, t1.guid, t3.value-t1.value
FROM tableName t1
INNER JOIN (SELECT min(t2.Date) minDate, t2.GUID 
            FROM TableName t2
            WHERE t2.Date> t1.date  
            GROUP BY t2.GUID ) B
 on B.GUID = t1.guid
INNER JOIN tableName t3
 on t3.GUID= T1.guid
and t3.date = b.mindate

这里假设guid和日期是唯一的一对,所有记录都不重复。

这里根据您提供的信息再增加一对。这可能就是你所看到的

declare @test table 
(
    dateId date,
    gguid uniqueidentifier,
    value int 
)

insert into @test(dateId,gguid,value)
Values('10/1/2015','1DFE73AF-7940-4CDC-A22F-92DA8DEF7B6E', 10),
('10/1/2015', '6A057D92-7279-4E34-8ADC-870E45B5D49A', 5),
('10/2/2015', '1DFE73AF-7940-4CDC-A22F-92DA8DEF7B6E', 12),
('10/2/2015', '6A057D92-7279-4E34-8ADC-870E45B5D49A', 14),
('10/3/2015', '1DFE73AF-7940-4CDC-A22F-92DA8DEF7B6E', 11);

with test
as
(
select dateId,gguid,value 
,RANK() over (partition by gguid order by dateId) as RNK
from @test
) select T.dateId,T.gguid,T.value, IsNull(T.value-X.value,0) as lastday  from test T left join (select dateId,gguid,value, RNK+1 as RNK from test)  AS X
on  X.gguid = t.gguid and T.RNK = X.RNK
你应该使用

输出

忽略PreviousValue为NULL的行,然后计算值-PreviousValue

包扎

SELECT [Date], [guid], [value] - previousValue as [value]
FROM (
  SELECT [Date], [guid], [value],  
         LAG([value],1, null) OVER (PARTITION BY [guid] ORDER BY [Date]) as previousValue
  FROM Table1
) T
WHERE T.previousValue IS NOT NULL
ORDER BY [Date], [guid]

在SQL Server 2012+中,您将使用lead

如果您想要全部五行,可以执行以下操作:

select d.*, lead(value) over (partition by id order by date) as next_value
from data d;
对于特定的输出,您需要一个子查询:

select d.id, d.date, d.next_value
from (select d.*, lead(value) over (partition by id order by date) as next_value
      from data d
     ) d
where next_value is not null;

您使用的是哪种数据库管理系统?博士后?Oracle?每个id的日期差始终为1或仅为下一个日期?对于SqlServer,请同时包括2008年、2012年、2014年。您的意思是id1和id2是GUID。我们是否也有一个密钥标识字段,以便我们可以知道哪个是在何时创建的?如果给定日期的第二个条目的[value field]被存储为负数,则这将是一个简单的求和,并按[date]、[guid]分组。否则,我们将需要构建逻辑来确定哪个符号应该翻转。在你的例子中,看看:10/1,id1,10和10/1,id1,12,它应该是一个10/1,id1,2的汇总行,我们怎么知道它应该是12-10=2,而不是10-12=-2没有订单?年份:2012,11.0.5343没有关键标识。MS SQL Server
select d.*, lead(value) over (partition by id order by date) as next_value
from data d;
select d.id, d.date, d.next_value
from (select d.*, lead(value) over (partition by id order by date) as next_value
      from data d
     ) d
where next_value is not null;