比方說,我有個人的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