获取每天的最小值和最大值之间的差异
Get difference between Min and Max value of each day
我将传感器读数存储在table中,数据是仪表读数:
CaptureDate SensorID Value
2020-01-11 14:15:33.350 121 23908,0000
2020-01-11 14:00:33.300 123 23161,0000
2020-01-11 14:00:33.240 121 23901,0000
2020-01-11 13:45:33.137 123 23154,0000
2020-01-11 13:45:33.073 121 23894,0000
2020-01-11 13:30:32.927 123 23147,0000
我需要使用 SQL 来获取按 SensorID 筛选的一个月的每日总计,以获得类似于此的内容:
Date SensorID Value
2020-01-10 121 319
2020-01-11 121 249
2020-01-12 121 289
2020-01-13 121 263
2020-01-14 121 314
2020-01-15 121 248
我试图获取按天分组的最小值和最大值,但我无法通过计数器的差异来获取净值;
SELECT *
FROM Records
WHERE CaptureDate in
(
SELECT min(CaptureDate)
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) OR CaptureDate IN (
SELECT Max(CaptureDate)
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) ORDER BY CaptureDate
和return:
CaptureDate SensorID Value
2020-01-08 14:20:39.627 121 23601.0000
2020-01-08 17:50:39.843 121 23678.0000
2020-01-09 08:50:19.473 121 23678.0000
2020-01-09 18:05:20.300 121 23707.0000
2020-01-10 08:46:06.903 121 23707.0000
2020-01-10 18:15:20.007 121 23796.0000
试试看
With DailyMinMax AS
(
SELECT
CAST(CaptureDate AS date) date,
SensorID,
MIN(Value) minvalue,
Max(Value) maxvalue
FROM Records
GROUP BY CAST(CaptureDate AS date), SensorID
)
SELECT
date,
SensorID,
maxvalue-minvalue AS MaxMinDifference
FROM DailyMinMax
我没有测试过,但解决方案应该与此类似。您创建了两个不同的表,一个包含每日最小值,一个包含每日最大值,然后加入它们:
SELECT mx.CaptureDate, mx.value - mn.value FROM
(
SELECT CaptureDate, min(CaptureDate) value
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) mn, (
SELECT CaptureDate, Max(CaptureDate) value
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) mx
WHERE mx.CaptureDate = mn.CaptureDate
ORDER BY mx.CaptureDate
我建议尝试将聚合计数存储在一个单独的列中,运行 您对该列的查询。我不认为 group by aggregates 会持续存在并传递给外部查询。
我找到了解决办法!
没有什么比把问题暴露出来更能理清思路了
SELECT SensorID, CAST(CaptureDate AS DATE) AS Date, MAX(Value)-MIN(Value) As dValue
FROM Readings
WHERE SensorID = 121
GROUP BY CAST(CaptureDate AS DATE), SensorID
ORDER BY CaptureDate
现在多容易啊! :D
这应该有效:
演示:DB Fiddle
select
convert(date, capturedate) date_only,
sensorid,
min(value) min_val,
max(value) max_val,
max(value) - min(value) diff
from records
group by convert(date, capturedate), sensorid
我将传感器读数存储在table中,数据是仪表读数:
CaptureDate SensorID Value
2020-01-11 14:15:33.350 121 23908,0000
2020-01-11 14:00:33.300 123 23161,0000
2020-01-11 14:00:33.240 121 23901,0000
2020-01-11 13:45:33.137 123 23154,0000
2020-01-11 13:45:33.073 121 23894,0000
2020-01-11 13:30:32.927 123 23147,0000
我需要使用 SQL 来获取按 SensorID 筛选的一个月的每日总计,以获得类似于此的内容:
Date SensorID Value
2020-01-10 121 319
2020-01-11 121 249
2020-01-12 121 289
2020-01-13 121 263
2020-01-14 121 314
2020-01-15 121 248
我试图获取按天分组的最小值和最大值,但我无法通过计数器的差异来获取净值;
SELECT *
FROM Records
WHERE CaptureDate in
(
SELECT min(CaptureDate)
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) OR CaptureDate IN (
SELECT Max(CaptureDate)
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) ORDER BY CaptureDate
和return:
CaptureDate SensorID Value
2020-01-08 14:20:39.627 121 23601.0000
2020-01-08 17:50:39.843 121 23678.0000
2020-01-09 08:50:19.473 121 23678.0000
2020-01-09 18:05:20.300 121 23707.0000
2020-01-10 08:46:06.903 121 23707.0000
2020-01-10 18:15:20.007 121 23796.0000
试试看
With DailyMinMax AS
(
SELECT
CAST(CaptureDate AS date) date,
SensorID,
MIN(Value) minvalue,
Max(Value) maxvalue
FROM Records
GROUP BY CAST(CaptureDate AS date), SensorID
)
SELECT
date,
SensorID,
maxvalue-minvalue AS MaxMinDifference
FROM DailyMinMax
我没有测试过,但解决方案应该与此类似。您创建了两个不同的表,一个包含每日最小值,一个包含每日最大值,然后加入它们:
SELECT mx.CaptureDate, mx.value - mn.value FROM
(
SELECT CaptureDate, min(CaptureDate) value
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) mn, (
SELECT CaptureDate, Max(CaptureDate) value
FROM Records
WHERE SensorID = 124
AND convert(date, CaptureDate) >= '2020-01-01'
GROUP BY convert(date, CaptureDate)
) mx
WHERE mx.CaptureDate = mn.CaptureDate
ORDER BY mx.CaptureDate
我建议尝试将聚合计数存储在一个单独的列中,运行 您对该列的查询。我不认为 group by aggregates 会持续存在并传递给外部查询。
我找到了解决办法! 没有什么比把问题暴露出来更能理清思路了
SELECT SensorID, CAST(CaptureDate AS DATE) AS Date, MAX(Value)-MIN(Value) As dValue
FROM Readings
WHERE SensorID = 121
GROUP BY CAST(CaptureDate AS DATE), SensorID
ORDER BY CaptureDate
现在多容易啊! :D
这应该有效:
演示:DB Fiddle
select
convert(date, capturedate) date_only,
sensorid,
min(value) min_val,
max(value) max_val,
max(value) - min(value) diff
from records
group by convert(date, capturedate), sensorid