如何根据条件过滤重复

xiao1682 2012-10-08 09:50:56
现有表T1:
识别 关键词 内容
------------
张三
6 张三 中国
张三 中国北京2
李四 33

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

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

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

请问这该如何写?谢谢。
...全文
117 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称被占用了 2012-10-09
  • 打赏
  • 举报
回复
有null的比较复杂


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
dodolzc10 2012-10-09
  • 打赏
  • 举报
回复

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


结果
识别 关键词 内容
----------- ---------- ----------
6 ?三 中?
NULL 李四 33

(2 row(s) affected)
因为是港版系统,有点乱码了
dodolzc10 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
SQL code

CREATE TABLE test
(
识别 INT ,
关键词 VARCHAR(10) ,
内容 VARCHAR(10)
)

INSERT INTO test
SELECT 6 ,
'张三' ,
……
[/Quote]
黄老师这个存在点点问题,如果有三个相同的关键字,其中两个有识别,就不能显示唯一值了
發糞塗牆 2012-10-09
  • 打赏
  • 举报
回复
我这个还复杂?很简单了咯,分成两部分,一部分是有多行,就取有表示的那行,另外一部分是只有一行的,那就保留,这个算法基本上已经没有压缩空间了。
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 )
xiao1682 2012-10-09
  • 打赏
  • 举报
回复
嗯,二个都可以,但运算有点复杂,有没简单点的,运算少点的语句呢?
發糞塗牆 2012-10-08
  • 打赏
  • 举报
回复
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'

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)
/*
识别 关键词 内容
----------- ---------- ----------
6 张三 中国
NULL 李四 33

(2 行受影响)

*/

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧