计算消耗归零

时间:2019-02-09 11:07:06

标签: sql sql-server

我创建了一个查询来计算表中值的消耗量(增量)。

我已经在众多数据集上进行了测试,返回的值始终为零。

这是一个带有数据集和查询的数据库小提琴: 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

3 个答案:

答案 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;

db<>fiddle

答案 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