SQL选择行,其中列值是唯一的(仅出现一次)

时间:2019-03-19 09:14:34

标签: sql google-bigquery

提供表格

| 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  |

8 个答案:

答案 0 :(得分:2)

使用相关子查询

DEMO

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
)