读书人

怎么根据条件过滤重复

发布时间: 2012-10-20 14:12:48 作者: rapoo

如何根据条件过滤重复
现有表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    李四    33NULL    王五    中国北京2
[解决办法]
我这个还复杂?很简单了咯,分成两部分,一部分是有多行,就取有表示的那行,另外一部分是只有一行的,那就保留,这个算法基本上已经没有压缩空间了。
SQL code
SELECT  *FROM    test aWHERE   关键词 IN ( SELECT 关键词                 FROM   test                 GROUP BY 关键词                 HAVING COUNT(1) > 1 )        AND 识别 IS NOT NULLUNION ALLSELECT  *FROM    test aWHERE   关键词 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)ROWfrom test )select 识别,关键词,内容 from yy where ROW=1 

读书人网 >SQL Server

热点推荐