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

SQL选择行,其中列值是唯一的(仅显示一次),sql,google-bigquery,Sql,Google Bigquery,给定桌子 | id | Name | | 01 | Bob | | 02 | Chad | | 03 | Bob | | 04 | Tim | | 05 | Bob | 我想从名称唯一的行中选择名称和ID,该行只显示一次 这本质上与相同,但请注意作者不需要id,因此问题可以通过名为COUNTname=1的组来解决 但是,我需要提取整行,可以是数十列或数百列,包括id,其中COUNTname=1,但我不能按id、name分组,因为它们的每个组合都是唯一的 编辑: 我正在使用Google

给定桌子

| id | Name |
| 01 | Bob  |
| 02 | Chad |
| 03 | Bob  |
| 04 | Tim  |
| 05 | Bob  |
我想从名称唯一的行中选择名称和ID,该行只显示一次

这本质上与相同,但请注意作者不需要id,因此问题可以通过名为COUNTname=1的组来解决

但是,我需要提取整行,可以是数十列或数百列,包括id,其中COUNTname=1,但我不能按id、name分组,因为它们的每个组合都是唯一的

编辑:

我正在使用Google BigQuery

预期成果:

| id | Name |
| 02 | Chad |
| 04 | Tim  |

使用exists并检查uqique名称

   select id,name 
    from table t1 
   where exists ( select 1 from table t2 where t1.name=t2.name

    having count(*)=1
)

使用相关子查询

输出:

id  name
2   Chad
4   Tim
请试试这个

SELECT 
   DISTINCT id,NAME
FROM
   tableName

您可以使用多个子查询来提取所需内容

SELECT * FROM tableName
WHERE name IN (SELECT name FROM (SELECT name, COUNT(name) FROM tableName
                                 GROUP BY name 
                                 HAVING COUNT(name) = 1) AS subQuery)
您可以使用“不存在”:

这将需要tableid、name上的索引来生成更快的结果集

只需分组。使用必须确保一个名称只存在一次。使用MIN为名称选择唯一的id

select min(id), name
from tablename
group by name
having count(*) = 1

只阅读一次表格将提高性能!别忘了在name,id上创建一个索引。

简单的聚合怎么样

select any_value(id), name
from t
group by name
having count(*) = 1;

BigQuery可以很好地处理聚合,因此这可能也非常有效。

下面是BigQuery标准SQL,适用于任意数量的列,不需要显式调用它们,也不需要任何连接或子选择

#standardSQL
SELECT t.*
FROM (
  SELECT ANY_VALUE(t) t
  FROM `project.dataset.table` t
  GROUP BY name
  HAVING COUNT(1) = 1
)

SQL只是一种语言,而不是实际的产品。请告诉我们您使用的是哪个版本的SQL,例如MySQL、SQL Server、Oracle、Postgres等。即使您发现预期结果显而易见,也最好指定预期结果。谢谢您的评论,我已经用SQL版本和预期结果更新了这个问题。我无法理解是谁在不理解答案的情况下对我投了反对票——如果你认为你有足够的知识的话——我还没有投票给你的答案,但我注意到在你的输出中没有提到Tim。也许你忘了编辑:写下他了?@Czarek,你看过演示了吗?去那里为tim添加另一行-它会出现如果你更新你的帖子,把所有行都包含在小提琴中,并在你的例子中包含与小提琴相同的代码,我会把它标记为接受。这会给我每个不同的id和名称组合。
select any_value(id), name
from t
group by name
having count(*) = 1;
#standardSQL
SELECT t.*
FROM (
  SELECT ANY_VALUE(t) t
  FROM `project.dataset.table` t
  GROUP BY name
  HAVING COUNT(1) = 1
)