有许多可能的方法来达到旅游所需的结果。其中之一是加入一个子查询,该子查询分别获取每个 Name 的记录数,然后将子查询的结果重新加入表本身。
SELECT a.name, a.Level,
b.TotalCount
FROM TableName a
INNER JOIN
(
SELECT Name, Count(*) TotalCount
FROM TableName
GROUp BY Name
) b ON a.Name = b.Name
为了获得更快的性能,您应该定义一个INDEX
on 列Name
。
输出
╔══════╦═══════╦════════════╗
║ NAME ║ LEVEL ║ TOTALCOUNT ║
╠══════╬═══════╬════════════╣
║ n1 ║ L1 ║ 2 ║
║ n1 ║ L2 ║ 2 ║
║ n2 ║ L1 ║ 2 ║
║ n2 ║ L3 ║ 2 ║
║ n3 ║ L1 ║ 1 ║
║ n4 ║ L3 ║ 1 ║
╚══════╩═══════╩════════════╝
更新 1
具有 1 级的名称,该级别是 L1(即 n3)
询问:
SELECT Name
FROM TableName
GROUP BY Name
HAVING COUNT(*) = 1 AND
MAX(Level) = 'L1'
名称有 2 个级别,这些级别是 L1 和 L3(即 n2)
询问:
SELECT Name
FROM TableName
GROUP BY Name
HAVING COUNT(*) = 2 AND
SUM(CASE WHEN Level IN ('L1', 'L3') THEN 1 ELSE 0 END) = COUNT(*)