我创建了一个查询来计算表中值的消耗量(增量)。
我已经在众多数据集上进行了测试,返回的值始终为零。
这是一个带有数据集和查询的数据库小提琴: DB Fiddle
数据集中的第一行是起点,将为零。结果表的第二行应为0.2,依此类推。
我不知道为什么零又回来了,我显然做错了。
预期输出如下:
2209 27/09/2018 22:45:00 0.00 v1
2209 27/09/2018 23:00:00 0.01 v1
2209 27/09/2018 23:15:00 0.03 v1
2209 27/09/2018 23:30:00 0.02 v1
2209 27/09/2018 23:45:00 0.02 v1
2209 28/09/2018 00:00:00 0.02 v1
2209 28/09/2018 00:15:00 0.02 v1
2209 28/09/2018 00:30:00 0.00 v1
2209 28/09/2018 00:45:00 0.05 v1
2209 28/09/2018 01:00:00 0.02 v1
重要的一点是行为零,该值将为零。但是,下一行的消耗量将小于零之前的值。这在第8和9行中显示。
TIA
答案 0 :(得分:1)
如果将ChannelValue
的数据类型更改为decimal
(也许是decimal(10,2)
),则会为您带来大部分的结果:
SELECT UD.SerialNumber,
UD.ReadingDate,
ChannelValue - LAG(ChannelValue,1,ChannelValue) OVER (PARTITION BY ChannelName ORDER BY ReadingDate ASC)
FROM UriData UD;
当ChannelValue
转到0
时,这是“错误的”,但是同样,我们缺少您需求背后的逻辑。希望这能使您获得距离
编辑:这种猜测似乎可以做到:
SELECT UD.SerialNumber,
UD.ReadingDate,
ChannelValue - LAG(ChannelValue,1,ChannelValue) OVER (PARTITION BY ChannelName, CASE ChannelValue WHEN 0 THEN 0 ELSE 1 END ORDER BY ReadingDate ASC)
FROM UriData UD
ORDER BY ReadingDate;
答案 1 :(得分:0)
您正在ReadingDate
上(在其他列中)分组。这意味着每个组将由一行组成。在该组中,max(ChannelValue)
与min(ChannelValue)
相同。减去两个相等的值将得出零。
答案 2 :(得分:0)
您在问题中的要求还不清楚,但是示例数据和注释确实阐明了它们。
基本上,您需要lag()
,但您也想忽略0
值。在SQL Server中没有简单的方法可以完成此任务。该标准有IGNORE NULL
个,但尚未实现。
一种方法是累积最大值。但是,这将要求数据始终在增加。尽管可能是这种情况,但并未明确提及。
话虽如此,以下内容将返回您指定的结果:
SELECT SerialNumber, ChannelName, ReadingDate AS [DateConsumption],
ChannelValue - LAG(ChannelValue, 1, ChannelValue) OVER (PARTITION BY SerialNumber, ChannelName ORDER BY ReadingDate)
FROM UriData
WHERE ChannelValue <> 0
UNION ALL
SELECT SerialNumber, ChannelName, ReadingDate AS [DateConsumption], 0
FROM UriData
WHERE ChannelValue = 0
ORDER BY SerialNumber, ChannelName, DateConsumption;
Here是db <>小提琴。
一些附加说明:
datetime
列转换为datetime
。value
,所以它是数字而不是字符串。使用适当的类型存储数据。NULL
,而不是0
。