我有一张这样的表:
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年)。 当然我的桌子很大,我不能手动完成。感谢。
答案 0 :(得分:3)
如果您只想拥有计数> 1的条目,那么您可以这样做:
Select year, month, code, count(1) as cnt from table1 group by year, month having cnt>1;
如果表格很大,请确保year
和month
都是索引,否则您将花费大量时间等待结果。
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;
答案 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;
您将获得不同年份的所有月份,并且其中一个重复的月份被淘汰。