比方说,我有个人的ID(1-8)和人的角色(1-4)作为这样的一个表:选择重复的/不重复计数或组计数N值BY
CREATE TABLE personRole (
PersonId int NOT NULL,
RoleId int NOT NULL
);
INSERT INTO personRole
VALUES
(1, 1),
(1, 2),
(2, 1),
(2, 3),
(3, 3),
(4, 3),
(1, 4),
(5, 2),
(6, 1),
(7, 1),
(7, 4),
(8, 1),
(8, 2),
(8, 4)
;
我的目标是选择人物ID的谁拥有3点或更多的角色和角色是专门1,2,4,这是我的第一个解决方案:
SELECT PersonId FROM personRole
WHERE RoleID in (1,2,4)
GROUP BY PersonId
HAVING count(*) >= 3
但后来有人告诉我,这样做没有GROUP BY,因为它是慢,所以我想出了这个解决方案:
SELECT distinct PersonId
FROM
(
SELECT PersonId, count(*) over(partition by PersonId) AS pcount
FROM (SELECT * FROM personRole WHERE RoleID in (1,2,4)) AS A
) AS S
WHERE pcount >= 3
我已经包含这些举例来说明我正在努力实现的目标。 但现在我已被告知尝试不计数。我目前能够找到具有重复/重复的人的ID这样的所有行:
SELECT personId
FROM personRole AS a
WHERE EXISTS (
SELECT 1
FROM personRole AS a2
WHERE a2.PersonId = a.PersonId
AND a2.RoleID <> a.RoleID
);
但我坚持试图找出如何只能选择他们,如果他们重复3次以上。如果我能够,那么我怀疑我可以只用INTERSECT它:
SELECT PersonId FROM personRole
WHERE RoleID in (1,2,4)
为了得到我的完整解决方案。我到目前为止正确解决这个问题,还是我的方向不对?
它不能大于3可以吗?我认为你应该重新审视你的原始查询,并探究为什么它很慢。 – Strawberry