2014-03-12 54 views
0

我有一個表是這樣的:MySQL查詢每一個亞組

Year Month Code 
1850 January 5210 
1850 February 3524 
1851 January 6752 
1851 January 9877 
1851 February 3698 

我想年份(例如1851年一月)中刪除重複個月。我不介意丟失一個代碼(6752或9877)。我想用:

Select * from table1 group by Month 

但我需要爲每年組。否則,我只會從表格中的三個中選擇一個一月份,我需要選擇其中的兩個(1850年一個,1851年一個)。 當然我的桌子很大,我不能手動做。謝謝。

回答

3

如果你想有隻數項> 1,那麼你可以這樣做:

Select year, month, code, count(1) as cnt from table1 group by year, month having cnt>1; 

如果表是巨大的,確保兩個yearmonth是索引,否則你會花很多時候都在等待結果。

http://sqlfiddle.com/#!2/eb325/3

更新:對於其中有超過2行(實際上在一般情況下,如果你不關心丟失的「代碼」的條目)的情況下,它可能是有意義來選擇一個條目每年從一個月到一個新的表(你會留下獨特的年月組合),然後丟棄舊錶,這樣的:

CREATE TABLE table1_temp SELECT year, month, MIN(code) as code FROM table1 GROUP BY year, month; 
DROP TABLE table1; 
RENAME TABLE table1_temp TO table1; 

http://sqlfiddle.com/#!2/113954/1

+1

'SELECT *'與'GROUP BY'結合是一個危險的習慣。 –

+0

是的。固定。 – Ashalynd

+0

這樣比較好。我會使用'選擇年份,月份,MIN(代碼)A​​S代碼......「查詢可以在所有SQL模式下工作,但這沒關係。 –

-1

試試這個:

Select *, count(month) as cnt from table1 group by Year, Month; 

您將得到不同年份的所有月份,並且重複月份中的任何一個都被消除。

this

+0

'SELECT *'與'GROUP BY'結合是一個危險的習慣。 –

+0

是的,先生,有沒有辦法讓所有的領域和使用一個組? –

+0

是的,有。但是,您的查詢返回不確定的結果。它甚至可能返回表中不存在的行(將多行的值合併爲一個。) –

0

查詢通過@Ashalynd建議將工作,如果你只有2個重複行,但如果你有3個行對1951年及一月它不會工作...下面的查詢會照顧它。您可以刪除從下面查詢獲取的所有行。

SELECT 
DISTINCT b.CODE 
FROM 
(SELECT YEAR, MONTH, CODE, COUNT(1) AS cnt FROM table1 GROUP BY YEAR, MONTH HAVING cnt>1) a, 
table1 b 
WHERE a.year=b.year AND a.month=b.month AND a.code<>b.code; 

另一種方法可以按照如下─

CREATE TABLE table1_new LIKE table1;ALTER TABLE table1_new ADD UNIQUE KEY (YEAR,MONTH);INSERT IGNORE INTO table1_new SELECT * FROM table1; 
TRUNCATE TABLE table1;INSERT INTO table1 SELECT * FROM table1_new; 
DROP TABLE table1_new; 

注意:如果你要保持你的價值觀獨特的基於這些字段,然後創建唯一索引你的主表。

+0

爲不同的方法檢查我更新的答案 – Ashalynd

+0

是的,另一種方法可以是這樣的,由我在上面更新.. –