sql - 选择记录等于 y 但不等于 x 的用户

标签 sql sql-server tsql

我有一个表,其中包含比赛中参赛者投票的历史记录。该结构的简化示例是:

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 = 4roundId = 3 但相同“entrantId”没有记录的用户的所有记录任何 roundId = 4

的类型

因此,使用上面的数据,我希望检索记录 403405,因为这些参赛者(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);

LiveDemo

输出:

╔═════╦═══════════╦═════════╦═════════╗
║ 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;

LiveDemo2

关于sql - 选择记录等于 y 但不等于 x 的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748540/

相关文章:

sql - 如何在Django中每天为数据库创建新表

Mysql语句转Sql Server

mysql - 如何使用 SymmetricDS 将 MSSQL 表同步到 MYSQL 表

sql - 计算一次查询中跨多个表的行数

sql - 寻找一种更有效的方法将 IP 地址分解为八位字节

ios - 如何使用 iOS Swift 在 Azure DB 中执行 SQL 字符串包含查询?

mysql - 如何使用纯 SQL 将字符串解析为日期组件?

sql-server - CHARINDEX 一直返回 0

sql - 在内存或 tempdb 中创建和保存的表变量?

java - 将数据sql重命名为xml