提供表格
| id | Name |
| 01 | Bob |
| 02 | Chad |
| 03 | Bob |
| 04 | Tim |
| 05 | Bob |
我要从名称唯一(仅出现一次)的行中选择名称和ID
这与How to select unique values of a column from table?基本相同,但是请注意作者不需要ID,因此可以通过GROUP BY name HAVING COUNT(name) = 1
但是,我需要提取包括id在内的整行(可能是数十或数百列),其中COUNT(name) = 1
,但是我不能GROUP BY id, name
,因为它们的每种组合都是唯一的。>
编辑:
我正在使用Google BigQuery。
预期结果:
| id | Name |
| 02 | Chad |
| 04 | Tim |
答案 0 :(得分:2)
使用相关子查询
select * from tablename a
where not exists (select 1 from tablename b where a.name=b.name having count(*)>1)
输出:
id name
2 Chad
4 Tim
答案 1 :(得分:1)
您可以使用NOT EXISTS
:
SELECT t.*
FROM table t
WHERE NOT EXISTS (SELECT 1 FROM table t1 WHERE t1.name = t.Name AND t1.id <> t.id);
这需要table(id, name)
上的索引才能产生更快的结果集。
答案 2 :(得分:1)
只需执行GROUP BY
。使用HAVING
确保名称只有一次。使用MIN()
来选择名称的唯一ID。
select min(id), name
from tablename
group by name
having count(*) = 1
只读取一次表将提高性能! (并且不要忘记在(name,id)上创建索引。)
答案 3 :(得分:0)
使用存在并检查uqique名称
select id,name
from table t1
where exists ( select 1 from table t2 where t1.name=t2.name
having count(*)=1
)
答案 4 :(得分:0)
请尝试这个。
SELECT
DISTINCT id,NAME
FROM
tableName
答案 5 :(得分:0)
您可以使用多个子查询来提取所需的内容。
SELECT * FROM tableName
WHERE name IN (SELECT name FROM (SELECT name, COUNT(name) FROM tableName
GROUP BY name
HAVING COUNT(name) = 1) AS subQuery)
答案 6 :(得分:0)
简单的聚合怎么样?
select any_value(id), name
from t
group by name
having count(*) = 1;
BigQuery与聚合效果很好,因此这可能也非常有效。
答案 7 :(得分:0)
以下内容适用于BigQuery标准SQL,适用于任意数量的列,无需显式调用它们,不需要任何联接或子选择
#standardSQL
SELECT t.*
FROM (
SELECT ANY_VALUE(t) t
FROM `project.dataset.table` t
GROUP BY name
HAVING COUNT(1) = 1
)