我有一个表,其中包含比赛中参赛者投票的历史记录。该结构的简化示例是:
id | entrantId | roundId | judgeId
一些示例数据:
401 | 32 | 3 | 4
402 | 32 | 3 | 5
403 | 35 | 3 | 4
404 | 32 | 4 | 4
405 | 36 | 3 | 4
406 | 36 | 3 | 10
我需要获取具有 judgeId = 4
和 roundId = 3
但相同“entrantId”没有记录的用户的所有记录任何 roundId = 4
因此,使用上面的数据,我希望检索记录 403
和 405
,因为这些参赛者(35 和 36)在第 3 轮中拥有法官 4 的记录,但是第 4 轮没有记录(例如 roundId = 4)。
我假设我需要一个使用基于“IN”子句的 SELECT 语句,但我对此了解不够,无法构建合适的查询。
最佳答案
您可以使用相关子查询:
SELECT *
FROM tab t1
WHERE judgeId = 4
AND roundId = 3
AND NOT EXISTS (SELECT 1
FROM tab t2
WHERE t1.entrantId = t2.entrantId
AND t2.roundId = 4);
输出:
╔═════╦═══════════╦═════════╦═════════╗
║ id ║ entrantId ║ roundId ║ judgeId ║
╠═════╬═══════════╬═════════╬═════════╣
║ 403 ║ 35 ║ 3 ║ 4 ║
║ 405 ║ 36 ║ 3 ║ 4 ║
╚═════╩═══════════╩═════════╩═════════╝
<小时/>
或者使用窗口函数:
WITH cte AS(
SELECT *,
c = COUNT(CASE WHEN roundId = 4 THEN 1 END) OVER (PARTITION BY entrantId)
FROM #tab
)
SELECT id,entrantId,roundId,judgeId
FROM cte
WHERE c = 0
AND judgeId = 4
AND roundId = 3;
关于sql - 选择记录等于 y 但不等于 x 的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748540/