【问题标题】:Get difference between Min and Max value of each day获取每天的最小值和最大值之间的差异
【发布时间】:2020-04-30 23:06:04
【问题描述】:

我将传感器读数存储在一个表格中,数据是仪表读数:

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

然后返回:

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

【问题讨论】:

  • “每日总计”是什么意思?您是否在寻找每天的平均值?
  • 您每天需要每个传感器的最小值和最大值吗?以及它们之间的区别?有点疑惑,这种情况下249是怎么得到的:2020-01-11 121 249

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

试试看

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 

【讨论】:

    【解决方案2】:

    我没有测试过,但解决方案应该与此类似。您创建了两个不同的表,一个具有每日最小值,另一个具有 dailt 最大值,然后加入它们:

    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  
    

    【讨论】:

      【解决方案3】:

      我找到了解决方案! 没有什么比暴露问题来澄清我的想法更好的了

      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

      【讨论】:

        【解决方案4】:

        这应该可行:

        演示: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
        

        【讨论】:

          【解决方案5】:

          我建议尝试将汇总计数存储在单独的列中,然后在该列上运行您的查询。我不认为按聚合分组会持续存在并传递给外部查询。

          【讨论】:

          • 这是评论而非答案。获得声誉后,您就可以发表评论了。
          猜你喜欢
          • 1970-01-01
          • 2012-10-09
          • 2021-06-03
          • 2017-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-19
          相关资源
          最近更新 更多