2013-07-18 79 views
0

我遇到了一些麻煩編寫簡潔的代碼,以有效地產生期望的結果(在多萬條記錄DB)。的MySQL GROUP BY與排序

  • 項將通過time
  • 項被分組將是選擇通過provider在於乙優先於A(和C在B)
  • 值必須選擇提供商的匹配值

表vs想要的結果:

// 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 /排序問題。

非常感謝。

+0

我想你應該解釋爲什麼這是理想的結果。 –

+0

@EvanMulawski有不同的供應商比帶來數據上的時間序列,但是當有重疊的時間字段我想從商B的數據優先於A(和etecetera) – Frankie

回答

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 
+0

這絕對是比更優雅的我了。仍然執行慢的(最多4秒),但它是如此簡潔得多,我可能可以通過請求的時候只有有限桶加快步伐。謝謝! – Frankie

+0

你可以用'解釋選擇...',看看那裏的性能瓶頸。 –

+0

所有指標看起來不錯。主要的瓶頸實際上是不得不與這樣的數據集大小進行分組。它可以並且可以通過限制時間範圍來控制。謝謝! – Frankie

0

這表現如何?

SELECT 
    * 
FROM 
    `data_teste` dt1 
    LEFT JOIN `data_teste` dt2 ON (dt2.time = dt1.time 
            AND dt2.provider > dt1.provider) 
WHERE 
    dt2.ID IS NULL