2011-08-12 4 views
0

I次のクエリがあります。部分的に重複したデータのうち、優先列を選択してください

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; 

以下のデータは以下のようになり与えられた単純なクエリを:現在のデータを考えるとdebugcount

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) 

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

私はさまざまな情報源から値を選択することができますが、私は持っています:
- manualソース、これは黄金です。
- readデータソースのソース、建物のメーター、
- calculatedデータは、欠落したデータを補うために補間されます。

mt_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 

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

答えて

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としてそれを参照して並べ替え(分)の優先順位。

+0

シンプルなので、私は思いやりのある複雑なものに詰まっていたと思います。ありがとう。 – Johan

関連する問題