Sql 选择具有重复成员身份的重复人员
使用schema和我最初的尝试Sql 选择具有重复成员身份的重复人员,sql,sql-server,duplicates,Sql,Sql Server,Duplicates,使用schema和我最初的尝试 CREATE TABLE person ([firstname] varchar(10), [surname] varchar(10), [dob] date, [personid] int); INSERT INTO person ([firstname], [surname], [dob] ,[personid]) VALUES ('Alice', 'AA', '1/1/1990', 1), ('Alice', 'AA', '
CREATE TABLE person
([firstname] varchar(10), [surname] varchar(10), [dob] date, [personid] int);
INSERT INTO person
([firstname], [surname], [dob] ,[personid])
VALUES
('Alice', 'AA', '1/1/1990', 1),
('Alice', 'AA', '1/1/1990', 2),
('Bob' , 'BB', '1/1/1990', 3),
('Carol', 'CC', '1/1/1990', 4),
('Alice', 'AA', '1/1/1990', 5),
('Kate' , 'KK', '1/1/1990', 6),
('Kate' , 'KK', '1/1/1990', 7)
;
CREATE TABLE person_membership
([personid] int, [personstatus] varchar(1), [memberid] int);
INSERT INTO person_membership
([personid], [personstatus], [memberid])
VALUES
(1, 'A', 10),
(2, 'A', 20),
(3, 'A', 30),
(3, 'A', 40),
(4, 'A', 50),
(4, 'A', 60),
(5, 'T', 70),
(6, 'A', 80),
(7, 'A', 90);
CREATE TABLE membership
([membershipid] int, [memstatus] varchar(1));
INSERT INTO membership
([membershipid], [memstatus])
VALUES
(10, 'A'),
(20, 'A'),
(30, 'A'),
(40, 'A'),
(50, 'T'),
(60, 'A'),
(70, 'A'),
(80, 'A'),
(90, 'T');
有三张桌子(根据上面的小提琴)Person
表包含重复项,同一个人输入了多次,在本练习中,我们假设名字、姓氏和DoB的组合足以唯一识别一个人
我正在尝试构建一个查询,该查询将显示重复的人(名字+姓氏+Dob),在Person
表中有两个或多个活动条目(Person\u membership.Person\u status=a
)和两个或多个活动成员身份(membership.mestatus=a
)
使用SQLFiddle中的示例,查询的结果应该是Alice(两个活动人员ID,两个活动成员ID)。
我认为我在以下努力中取得了进展,但这看起来相当麻烦,我需要将Katie从最终结果中删除-她没有重复的会员资格
SELECT q.firstname, q.surname, q.dob, p1.personid, m.membershipid
FROM
(SELECT
p.firstname,p.surname,p.dob, count(*) as cnt
FROM
person p
GROUP BY
p.firstname,p.surname,p.dob
HAVING COUNT(1) > 1) as q
INNER JOIN person p1 ON q.firstname=p1.firstname AND q.surname=p1.surname AND q.dob=p1.dob
INNER JOIN person_membership pm ON p1.personid=pm.personid
INNER JOIN membership m ON pm.memberid = m.membershipid
WHERE pm.personstatus = 'A' AND m.memstatus = 'A'
您必须添加
Group by
和Having
子句以仅返回重复的项目-
SELECT
person.firstname,person.surname,person.dob
FROM
person, person_membership, membership
WHERE
person.personid=person_membership.personid AND person_membership.memberid = membership.membershipid
AND
person_membership.personstatus = 'A' AND membership.memstatus = 'A'
GROUP BY
person.firstname,person.surname,person.dob
HAVING COUNT(1) > 1
您必须添加
Group by
和Having
子句以仅返回重复的项目-
SELECT
person.firstname,person.surname,person.dob
FROM
person, person_membership, membership
WHERE
person.personid=person_membership.personid AND person_membership.memberid = membership.membershipid
AND
person_membership.personstatus = 'A' AND membership.memstatus = 'A'
GROUP BY
person.firstname,person.surname,person.dob
HAVING COUNT(1) > 1
由于您使用的是SQL Server windows函数,因此在这种情况下非常方便。下面将为您提供预期的输出
SELECT firstname,surname,dob,personid,memberid
from(
SELECT firstname,surname,dob,p.personid,memberid
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid) rnasc
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid desc) rndesc
FROM [StagingGRG].[dbo].[person] p
INNER JOIN person_membership pm ON p.personid=pm.personid
INNER JOIN membership m ON pm.memberid = m.membershipid
where personstatus='A' and memstatus='A')a
where a.rnasc+rndesc>2
由于您使用的是SQL Server windows函数,因此在这种情况下非常方便。下面将为您提供预期的输出
SELECT firstname,surname,dob,personid,memberid
from(
SELECT firstname,surname,dob,p.personid,memberid
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid) rnasc
,Rank() over(partition by p.firstname,p.surname,p.dob order by p.personid desc) rndesc
FROM [StagingGRG].[dbo].[person] p
INNER JOIN person_membership pm ON p.personid=pm.personid
INNER JOIN membership m ON pm.memberid = m.membershipid
where personstatus='A' and memstatus='A')a
where a.rnasc+rndesc>2
始终最好使用ANSI连接语法。建议这样做。您的解决方案不显示Alice的person.personid、membership.membershipid信息,并且包含不应该在那里的Bob(他在person表中有一个条目),很遗憾,这不是我要找的。始终最好使用ANSI JOIN语法。建议这样做。您的解决方案没有显示Alice的person.personid、membershipid信息,并且包括不应该在那里的Bob(他在person表中只有一个条目),因此很遗憾,这不是我要查找的。对不起,您能发布预期输出吗?正如问题中所述-“查询的结果应该是Alice(两个活动的个人ID,两个活动的成员ID)。@MichalRosa所以基本上只有名称“Alice”"? 您在下面答案中的评论似乎表明您还需要某种形式的ID。我希望看到的输出与问题firstname、姓氏、dob、personid、memberidsorry中指定的完全相同,但您是否可以发布预期的输出?正如问题中所说—“查询的结果应该是Alice(两个活跃的个人ID,两个活跃的会员ID)。@MichalRosa所以基本上只有名字“Alice”?您在下面答案中的评论似乎表明您还需要某种形式的ID。我希望看到问题firstname、姓氏、dob、personid、MemberId中指定的输出。谢谢。需要修复几个拼写错误,我假设我需要做一个练习,看看我是否注意。非常聪明。五分钟后我已经了解了显示器的工作原理。我会将其保存为模板,以备将来与SQL的战斗。再次感谢。谢谢。需要修复几个拼写错误,我想我会留下来作为练习,看看我是否注意。非常聪明。在注视显示器五分钟后,我已经了解了它的工作原理。我会保存它将作为我未来与SQL作战的模板。再次感谢。