Phi*_*ley 3 sql t-sql sql-server
我有一张表格,其中包含参赛者参赛选票的历史记录.结构的简化示例是:
id | entrantId | roundId | judgeId
Run Code Online (Sandbox Code Playgroud)
一些示例数据:
401 | 32 | 3 | 4
402 | 32 | 3 | 5
403 | 35 | 3 | 4
404 | 32 | 4 | 4
405 | 36 | 3 | 4
406 | 36 | 3 | 10
Run Code Online (Sandbox Code Playgroud)
我需要得到谁拥有用户的所有记录的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);
Run Code Online (Sandbox Code Playgroud)
输出:
???????????????????????????????????????
? id ? entrantId ? roundId ? judgeId ?
???????????????????????????????????????
? 403 ? 35 ? 3 ? 4 ?
? 405 ? 36 ? 3 ? 4 ?
???????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |