Получите разницу между минимальным и максимальным значением каждого дня - PullRequest
0 голосов
/ 14 января 2020

Я храню показания датчиков в таблице, данные - показания счетчиков:

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

Я пытался получить минимальные и максимальные значения, сгруппированные по дням, но я не могу получить разницу счетчика для получения значения net;

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

И вернуть:

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

Ответы [ 5 ]

0 голосов
/ 14 января 2020

Это должно работать:

Демо: 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
0 голосов
/ 14 января 2020

Я нашел решение! Нет ничего лучше, чем разоблачить проблему, чтобы прояснить мои идеи

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

0 голосов
/ 14 января 2020

Я не проверял это, но решение должно быть что-то похожее на это. вы создаете две разные таблицы, одну с дневным минимумом и одну с максимальным значением, а затем соединяете их:

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  
0 голосов
/ 14 января 2020

Я предлагаю попробовать сохранить агрегированный счет в отдельном столбце и выполнить запрос по этому столбцу. Я не думаю, что группы по агрегатам сохраняются и передаются во внешний запрос.

0 голосов
/ 14 января 2020

Попробуйте это

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 
...