如何根据条件过滤重复
现有表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