根据列的重复值检索行
Retrieve rows on the basis of repeating value of a column
我想从我的 table Card
.
中检索数据
table Card(
MembershipNumber,
EmbossLine,
status,
EmbossName
)
这样只有那些具有重复 MembershipNumber 即 count
大于 1 的行才应该被 returned。
就像我有以下记录
(11,0321,'active','John')
(11,0322,'active','John')
(23,0350,'active','Mary')
(46,0383,'active','Fudge')
(46,0382,'active','Fudge')
(46,0381,'active','Fudge')
查询应该 return 除第三条记录外的所有记录。可能吗?
已编辑 我得到了问题的答案。我还有一个问题。我也想按 status
过滤行,但是当我 运行 以下查询时,我没有得到想要的结果:
SELECT EmbossLine,Membershipnumber,status,embossname,*
FROM (SELECT *,
Count(MembershipNumber)OVER(partition BY EmbossName) AS cnt
FROM card) A
WHERE cnt > 1 AND status='E0'
在 where 子句中添加 status
之前,它工作得很好。见图
添加状态过滤后
SELECT * FROM CARD a WHERE
(SELECT COUNT(*) FROM CARD b WHERE b.MembershipNumber = a.MembershipNumber) > 1
应该做
使用 Count() Over()
window 函数来执行此操作。
SELECT *
FROM (SELECT *,
Count(MembershipNumber)OVER(partition BY EmbossName) AS cnt
FROM youurtable) A
WHERE cnt > 1
演示
SELECT MembershipNumber,
[status],
EmbossName
FROM (SELECT *,
Count(MembershipNumber)OVER(partition BY EmbossName) AS cnt
FROM (VALUES (11.0321,'active','John'),
(11.0322,'active','John'),
(23.0350,'active','Mary'),
(46.0383,'active','Fudge'),
(46.0382,'active','Fudge'),
(46.0381,'active','Fudge')) tc (MembershipNumber, [status], EmbossName)) A
WHERE cnt > 1
Select c.* from card c
join (select MembershipNumber from table group by
MembershipNumber having count(MembershipNumber) > 1) mem
on mem.MembershipNumber = c.MembershipNumber
或者
Select * from table where MembershipNumber in
(select MembershipNumber from table group by
MembershipNumber having count(MembershipNumber) > 1)
在 empbossname 上查找重复项并得到结果
select t1.* from card as t1 inner join
(select empbossname from card group by empbossname having count(*)>1) as t2
on t1.empbossname =t2.empbossname
我想从我的 table Card
.
table Card(
MembershipNumber,
EmbossLine,
status,
EmbossName
)
这样只有那些具有重复 MembershipNumber 即 count
大于 1 的行才应该被 returned。
就像我有以下记录
(11,0321,'active','John')
(11,0322,'active','John')
(23,0350,'active','Mary')
(46,0383,'active','Fudge')
(46,0382,'active','Fudge')
(46,0381,'active','Fudge')
查询应该 return 除第三条记录外的所有记录。可能吗?
已编辑 我得到了问题的答案。我还有一个问题。我也想按 status
过滤行,但是当我 运行 以下查询时,我没有得到想要的结果:
SELECT EmbossLine,Membershipnumber,status,embossname,*
FROM (SELECT *,
Count(MembershipNumber)OVER(partition BY EmbossName) AS cnt
FROM card) A
WHERE cnt > 1 AND status='E0'
在 where 子句中添加 status
之前,它工作得很好。见图
添加状态过滤后
SELECT * FROM CARD a WHERE
(SELECT COUNT(*) FROM CARD b WHERE b.MembershipNumber = a.MembershipNumber) > 1
应该做
使用 Count() Over()
window 函数来执行此操作。
SELECT *
FROM (SELECT *,
Count(MembershipNumber)OVER(partition BY EmbossName) AS cnt
FROM youurtable) A
WHERE cnt > 1
演示
SELECT MembershipNumber,
[status],
EmbossName
FROM (SELECT *,
Count(MembershipNumber)OVER(partition BY EmbossName) AS cnt
FROM (VALUES (11.0321,'active','John'),
(11.0322,'active','John'),
(23.0350,'active','Mary'),
(46.0383,'active','Fudge'),
(46.0382,'active','Fudge'),
(46.0381,'active','Fudge')) tc (MembershipNumber, [status], EmbossName)) A
WHERE cnt > 1
Select c.* from card c
join (select MembershipNumber from table group by
MembershipNumber having count(MembershipNumber) > 1) mem
on mem.MembershipNumber = c.MembershipNumber
或者
Select * from table where MembershipNumber in
(select MembershipNumber from table group by
MembershipNumber having count(MembershipNumber) > 1)
在 empbossname 上查找重复项并得到结果
select t1.* from card as t1 inner join
(select empbossname from card group by empbossname having count(*)>1) as t2
on t1.empbossname =t2.empbossname