5

日ごとにグループ化された最大値と最小値の差を取得するクエリが必要です。私の試みはうまくいきません:

SELECT date(`date`), 
   (max(value) - min(value)) as value,
FROM `sub_meter_data` 
where date(sub_meter_data.date) > '2012-10-01' 
  and sub_meterID in('58984','58985','58986','58987')
group by date(`date`);

各sub_meterの値は、3000を超える可能性がありますが、1日あたりの違いは10未満です。違い、つまり結果<10が必要です。上記のクエリでは、3000を超える結果が得られます。

以下のこのクエリでは、1つのメーターを選択するだけで、正しい結果、最大(17531)、最小(17523)、および差(8)が得られます。

SELECT date(sub_meter_data.date) as date,
   max(value) as max_meter,
   min(value) as min_meter, 
   max(value) - min(value) as diff,
FROM `sub_meter_data`
where date(sub_meter_data.date) > '2012-10-01' 
  and sub_meterID in('57636')
  group by date(sub_meter_data.date)

しかし、in句に別のメーターを追加すると、悪い結果が得られます。最大値は17531、最小値は3021、差分は14510です。ただし、各メーターの差分を合計してから、合計します。

SELECT date(sub_meter_data.date) as date,
   max(value) as max_meter,
   min(value) as min_meter, 
   max(value) - min(value) as diff,
   FROM `sub_meter_data`
where date(sub_meter_data.date) > '2012-10-01' 
  and sub_meterID in('57636', '57628')
  group by date(sub_meter_data.date)

私が試したもう1つの試みは次のとおりです。

SELECT date(sub_meter_data.date) as date,
   sum(CASE WHEN sub_meterID = '57628' OR sub_meterID = '57636' THEN (max(value) -     min(value)) ELSE 0 END) as value
   FROM `sub_meter_data`
where date(sub_meter_data.date) > '2012-10-01' 
4

1 に答える 1

6

クエリは日 (日付) でのみグループ化されますが、メーターでもグループ化する必要があるため、次のように追加する必要がありますgroup by

select sub_meterID, date(`date`) as day, max(value) - min(value) as value
from `sub_meter_data`
where date(`date`) > '2012-10-01'
    and sub_meterID in ('58984','58985','58986','58987')
group by sub_meterID, date(`date`);

次に、日ごとの差を合計したい場合は、次のことができます。

select day, sum(diff) as total_diff
from (
    select sub_meterID, date(`date`) as day, max(value) - min(value) as diff
    from `sub_meter_data`
    where date(`date`) > '2012-10-01'
       and sub_meterID in ('58984','58985','58986','58987')
    group by sub_meterID, date(`date`)
    ) a
group by day

または、メーターで合計したい場合:

select sub_meterID, sum(diff) as total_diff
from (
    select sub_meterID, date(`date`) as day, max(value) - min(value) as diff
    from `sub_meter_data`
    where date(`date`) > '2012-10-01'
       and sub_meterID in ('58984','58985','58986','58987')
    group by sub_meterID, date(`date`)
    ) a
group by sub_meterID
于 2012-10-19T05:24:33.780 に答える