每个子组的MySQL查询

时间:2014-03-12 10:30:58

标签: mysql sql

我有一张这样的表:

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

我想在一年内删除重复的月份(例如1月1851年)。我不介意丢失一个代码(6752或9877)。我想过使用:

Select * from table1 group by Month

但我需要每年分组。否则我将从表中的三个中选择一个月,我需要选择其中两个(一个在1850年,一个在1851年)。 当然我的桌子很大,我不能手动完成。感谢。

3 个答案:

答案 0 :(得分: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 :(得分:0)

@Ashalynd建议的查询将有效,如果您只有2个重复的行,但如果您有19行年份和1月份的3行,它将无法工作...以下查询将照顾它。您可以从以下查询中删除所有行。

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;

另一种方法可以是以下AS -

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;

注意:如果你想保持你的VALUES UNIQUE基于这些FIELDS那么在你的主桌上创建独特的指数。

答案 2 :(得分:-1)

试试这个:

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

您将获得不同年份的所有月份,并且其中一个重复的月份被淘汰。

this