日期:2014-05-17  浏览次数:20428 次

如何根据条件过滤重复
现有表T1:
识别 关键词 内容
------------
  张三  
6 张三 中国  
  张三 中国北京2
  李四 33

通过过滤语句,得到如下效果:

识别 关键词 内容
------------
6 张三 中国 
  李四 33

即,如关键词字段中有二条以上是相同的,则过滤后只保留一条,但如果识别中带有“6”的,保留有“6”的那一条,其余删除掉。

请问这该如何写?谢谢。
 

------解决方案--------------------
有null的比较复杂


SQL code
CREATE TABLE test
     (
       识别 INT ,
       关键词 VARCHAR(10) ,
       内容 VARCHAR(10)
     )
 
 INSERT  INTO test     
         SELECT  6 ,
                 '张三' ,
                 '中国'
         UNION ALL
         SELECT  NULL ,
                 '张三' ,
                 NULL
         UNION ALL
         SELECT  NULL ,
                 '张三' ,
                 '中国北京2'
         UNION ALL
         SELECT  NULL ,
                 '李四' ,
                 '33'
         UNION ALL
         SELECT  NULL ,
                 '王五' ,
                 NULL
         UNION ALL
         SELECT  NULL ,
                 '王五' ,
                 '中国北京2'
                 
 SELECT * FROM test a
 where exists  (
    select 1
    from test b
    where b.关键词 = a.关键词
    and b.识别 = 6
    )
and not exists (
    select 1
    from test b
    where b.关键词 = a.关键词
    and b.识别 = 6
    and isnull(a.识别,0) <> 6
    )
 or not exists  (
    select 1
    from test b
    where b.关键词 = a.关键词
    and b.识别 = 6
    )
  and not exists (
    select 1
    from test b
    where b.关键词 = a.关键词
    and (isnull(b.识别,0)< isnull(a.识别,0)
    or isnull(b.识别,0)= isnull(a.识别,0)
    and isnull(b.内容,'')> isnull(a.内容,'')
    )
    )

--结果
识别    关键词    内容
6    张三    中国
NULL    李四    33
NULL    王五    中国北京2

------解决方案--------------------
我这个还复杂?很简单了咯,分成两部分,一部分是有多行,就取有表示的那行,另外一部分是只有一行的,那就保留,这个算法基本上已经没有压缩空间了。
SQL code
SELECT  *
FROM    test a
WHERE   关键词 IN ( SELECT 关键词
                 FROM   test
                 GROUP BY 关键词
                 HAVING COUNT(1) > 1 )
        AND 识别 IS NOT NULL
UNION ALL
SELECT  *
FROM    test a
WHERE   关键词 IN ( SELECT 关键词
                 FROM   test
                 GROUP BY 关键词
                 HAVING COUNT(1) = 1 )

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

CREATE TABLE test
     (
       识别 INT ,
       关键词 VARCHAR(10) ,
       内容 VARCHAR(10)
     )
 
 INSERT  INTO test     
         SELECT  6 ,
                 '张三' ,
                 '中国'
         UNION ALL
         SELECT  3 ,
                 '张三' ,
                 NULL
         UNION ALL
         SELECT  NULL ,
                 '张三' ,
                 '中国北京2'
         UNION ALL
         SELECT  NULL ,
                 '李四' ,
                 '33'
                 


with yy as(
select 识别,关键词,内容,ROW_NUMBER() over(partition by 关键词 order by 识别 desc)ROW
from test )
select 识别,关键词,内容 from yy where ROW=1