0

次のクエリがあります。

select 
  mb.id as meter_id
  ,ds.mydate as mydate
  ,mb.name as metergroup
  ,sum(ms.stand) as measured_cum_value 
  ,me.name as energy_medium
  ,e.name as unit_of_measure
  ,min(ms.source) as source
  ,count(*) as debugcount
FROM datumselect ds                            <<-- mem table with dates to query.
INNER JOIN metergroup mb ON (mb.building_id = 1)   
INNER JOIN meter m ON (m.metergroup_id = mb.id)  <<-- meters are grouped
INNER JOIN medium me ON (me.id = mb.medium_id)   <<-- lookuptables for normalization
INNER JOIN unit e ON (e.id = mb.unit_id)         <<-- ditto
INNER JOIN meterstand ms ON (ms.meter_id = m.id AND ms.mydate = ds.mydate)
group by ds.mydate, mb.id, ms.source  <<-- this is prob. broken.
having source = MIN(ms.source)   <<-- this `having` does not work !
ORDER BY mb.id, ds.mydate 

次の表から選択しています。

CREATE TABLE meterstand(
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  meter_id INT(11) UNSIGNED NOT NULL,
  mydate DATETIME NOT NULL,
  stand DECIMAL(16, 5) NOT NULL,
  source ENUM('calculated', 'read', 'manual') NOT NULL DEFAULT 'read',
  PRIMARY KEY (id),
  INDEX FK_meterstand_meter_id (meter_id),
  UNIQUE INDEX UK_meterstand (datum, meter_id, bron),
  CONSTRAINT FK_meterstand_meter_id FOREIGN KEY (meter_id)
  REFERENCES vaanstermeters.meter (id) ON DELETE RESTRICT ON UPDATE CASCADE
)
ENGINE = INNODB
AUTO_INCREMENT = 181
AVG_ROW_LENGTH = 105
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

以下のデータを指定すると、より単純なクエリは次のようになります。

SELECT 
  meter_id
  , mydate
  , sum(stand)
  , count(*) as debugcount
FROM meterstand
WHERE mydate IN (list_of_dates_im_interested_in)
GROUP BY meter_id, my_date
HAVING the_best(source) 

現在のデータdebugcountは常に 1 である必要がありますが、上記のクエリのグループに複数のメーターがある場合は、グループ内のメーターのdebugcount数にする必要があります。


異なるソースからの値から選択できますmanual
-read データソースからのソース、どこかの建物のメーター;
-calculated欠損データを補うために補間されたデータ。

同じデータポイントを持つ単一のデータポイントは、meter_id+mydate複数のソースを持つことができます。
クエリはmanualソースよりも優先し、他のデータが利用できない場合readにのみデータを選択する必要があります。calculated

のデータのサンプルを次に示しますmeterstand

id  meter_id mydate stand       source
------------------------------------------------------
179 6   1-12-2010   94,75886    calculated
180 7   1-12-2010   256,02618   calculated
164 7   1-1-2011    285,41800   manual <<--- Query should only consider this row.
183 7   1-1-2011    0,00000     read   <<-- and forget about this one

最適なデータ ポイントを選択するために使用する適切なクエリ構文は何ですか?

4

1 に答える 1

1

一見すると、MySQL は列挙型のソート順序を定義にリストされた順序として定義します。表示される順序の逆として順序を定義したことを考えると、次は期待どおりに機能すると思います (ただし、テストするインスタンスはありません)。

SELECT * 
FROM meterstand as a
JOIN (SELECT meter_id, mydate, MAX(source) as source
      FROM meterstand
      GROUP BY meter_id, mydate) as b
ON b.meter_id = a.meter_id
AND b.mydate = a.mydate
AND b.source = a.source

(もちろん、[meter_id, mydate, source] が一意であると仮定します)。

ある時点で、列挙型が文字列値でソートされるバグがあったようです (文字列を考えると、これはまったく役に立ちません)。
まだ存在する場合 (または使用順序をもう少し制御したい場合)、テーブルを定義することをお勧めします。

Meter_Reading_Type
========================
Id   Description   Priority
1    Manual        10
2    Calculated    30
3    Read          20

次に、それを fk として参照し、(最小) 優先度で並べ替えます。

于 2011-08-12T16:30:22.030 に答える