SQL-使用GUID的日期之间的值之间的差异
我有一张像这样的桌子: [日期],[guid],[value int] 数据如下所示: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
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;