日期:2014-05-18  浏览次数:20521 次

如何去掉重复项
简单去掉重复行我会操作,但是稍微复杂一点的就迷糊了,现问题如下:
单表如下(GUARANTEE):
字段:PRODUCT_TYPE MODELNAME  AFFIXNAME  AFFIXSNAME  FIXDATE  FIXMAN  AFFIXID
记录:
    1       ''      语音盒   HD1600BBQ   2012-01-01 安装老大  2
  0      龙翰16     ''     ''      2011-12-08 测试老大  NULL
  0      长江S300    ''     ''      2011-12-01 测试老大  NULL
  1       ''      油量检测  ''      2011-12-01 测试老四  3
  1       ''      卸料检测 HD1702XLS   2011-12-01 我饿uife  5

需求:去掉AFFIXID重复的行(值为null或数字相同就算重复,按FIXDATE降序排列,重复行保留FIXDATE最大值的行)后得到如下结果集

    1             语音盒   HD1600BBQ   2012-01-01 安装老大  2
  0      龙翰16                 2011-12-08 测试老大  NULL
  1             油量检测         2011-12-01 测试老四  3
  1             卸料检测 HD1702XLS  2011-12-01 我饿uife  5
也就是去掉了第三条记录,同时结果集中还要包含其他所有字段值。
对这个数据库去重原理不太明白,能说明去重原理的更好,谢谢啦。


------解决方案--------------------
SQL code

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'GUARANTEE')
BEGIN
    DROP TABLE GUARANTEE
END
GO
CREATE TABLE GUARANTEE
(
    PRODUCT_TYPE INT,
    MODELNAME VARCHAR(100),
    AFFIXNAME VARCHAR(100),
    AFFIXSNAME VARCHAR(100),
    FIXDATE VARCHAR(10),
    FIXMAN VARCHAR(10),
    AFFIXID INT
)
INSERT INTO GUARANTEE
SELECT 1,'','语音盒','HD1600BBQ','2012-01-01','安装老大',2 UNION
SELECT 0,'龙翰16','','','2011-12-08','测试老大',NULL UNION
SELECT  0,'长江S300','','','2011-12-01','测试老大',NULL UNION
SELECT   1,'','油量检测','','2011-12-01','测试老四',3 UNION
SELECT   1,'','卸料检测','HD1702XLS','2011-12-01','我饿uife',5

SELECT * FROM GUARANTEE AS T
WHERE (SELECT COUNT(*) FROM GUARANTEE WHERE ISNULL(t.AFFIXID,0) = ISNULL(AFFIXID,0) AND FIXDATE > T.FIXDATE) < 1

PRODUCT_TYPE    MODELNAME    AFFIXNAME    AFFIXSNAME    FIXDATE    FIXMAN    AFFIXID
0    龙翰16            2011-12-08    测试老大    NULL
1        卸料检测    HD1702XLS    2011-12-01    我饿uife    5
1        油量检测        2011-12-01    测试老四    3
1        语音盒    HD1600BBQ    2012-01-01    安装老大    2

------解决方案--------------------
去重就是删除多余的数据,但前提是你找出正确的数据来。然后:
SQL code
delete from ... where not exists ...