0

必要な結果を効率的に生成するための簡潔なコードを書くのに苦労しています(数百万のレコードDBで)。

  • アイテムはグループ化されますtime
  • 項目は、B が A よりも優先される (および C が B よりも優先される) ことによって選択されます。provider
  • 値は、選択したプロバイダーの値と一致する必要があります

テーブルと必要な結果:

// given this table
id | provider | time       | value
---+----------+------------+-----------
 1 |    A     | 2013-07-01 |  0.1
 2 |    A     | 2013-07-02 |  0.2
 3 |    B     | 2013-07-02 |  0.3
 4 |    A     | 2013-07-03 |  0.4

// extrapolate this result
---+----------+------------+-----------
1  |   A      | 2013-07-01 |  0.1
3  |   B      | 2013-07-02 |  0.3
4  |   A      | 2013-07-03 |  0.4

テーブルを生成してデータを入力するクエリ:

data_teste CREATE TABLE `data_teste` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`provider` varchar(12) NOT NULL,`time` date NOT NULL,`value` double NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `index` (`provider`,`time`),KEY `provider` (`provider`),KEY `time` (`time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO data_teste(`provider`, `time`, `value`) VALUES('A', '2013-07-01', 0.1),('A', '2013-07-02', 0.2),('B', '2013-07-02', 0.3),('A', '2013-07-03', 0.4);

これは、ウィンドウ化された従来の group_by/sort 問題です。

どうもありがとうございました。

4

2 に答える 2

1
select d.* 
from data_teste d
inner join
(
   select `time`, max(provider) mp
   from data_teste
   group by `time`
) x on x.mp = d.provider 
    and x.`time` = d.`time`
order by  `time` asc, 
          provider desc
于 2013-07-18T17:13:23.203 に答える