【问题标题】:Get number of values that only appear once in a column获取在一列中只出现一次的值的数量
【发布时间】:2011-09-26 14:31:51
【问题描述】:

首先,如果相关的话,我使用的是 MySQL,尽管我认为解决方案可以跨数据库产品工作。我的问题是:

我有一个单列的简单表格。列上没有约束。在这一列中有一些简单的数据,例如

a
a
b
c
d
d

我需要获取只出现一次的值的数量/计数。从上面的示例中,这将是 2(因为在列中仅 b 和 c 出现一次)。

希望很明显,我不想要 DISTINCT 值,而是 UNIQUE 值。实际上我之前已经这样做了,通过在列上创建一个具有 UNIQUE 约束的附加表,并简单地从旧表插入新表,并相应地处理重复项。

我希望找到一个不需要临时表的解决方案,并且可以通过一个漂亮的 SELECT 以某种方式完成。

【问题讨论】:

  • 对同时发布的三个类似答案大笑。
  • 此时,在重新阅读问题后,我实际上认为 Randy 或 Romain 获得了奖品,但你的格式确实比我更漂亮@Hugh Jones :D
  • 我做到了 :) 我们可能永远不会知道这个问题的真正含义——让我们继续……

标签: mysql sql unique


【解决方案1】:

假设您的表名为T,而您的字段名为F

SELECT COUNT(F)
FROM (
    SELECT F
    FROM T
    GROUP BY F
    HAVING COUNT(*) = 1
) AS ONLY_ONCE

【讨论】:

  • 为了我的钱 - 这是最好的答案。
  • 我如何在其中使用 where 即“WHERE (created_at BETWEEN '2021-06-01' AND '2021-06-01 23:59:59');”.. 因为我得到了这个错误。 “未知列 created_at”
【解决方案2】:

稍微嵌套一下……

select count( cnt ) from
( select count(mycol) cnt from mytab group by mycol )
where cnt = 1

【讨论】:

  • 发帖者,我认为,他的问题并没有完全正确。这个答案解决了与我们其他人所做的不同的解释。
  • @Hugh - 我不同意。对我来说似乎非常明确“我需要获取仅出现一次的值的数量/计数。从上面的示例中,这将是 2”,您的答案是完全错误的。这将返回与 Romain 相同的结果(尽管它缺少派生表的别名)
  • 是的 - 我重读了这个问题,它并没有模棱两可,但是,“我不想要 DISTINCT 值,我想要 UNIQUE 值”给了我错误的方式。
【解决方案3】:
select field1, count(field1) from my_table group by field1 having count(field1) = 1

select count(*) from (select field1, count(field1) from my_table group by field1 having count(field1) = 1)

第一个将返回唯一元素,第二个将返回唯一元素的数量。

【讨论】:

    【解决方案4】:
    select count(*) from 
    (
      select
        col1, count(*)
      from 
        Table
      group by 
        Col1
      Having 
        Count(Col1) = 1
    )
    

    【讨论】:

    • 我认为我的新版本最独立于平台
    【解决方案5】:

    可以这么简单吗:

    Select count(*) From MyTable Group By MyColumn Where Count(MyColumn) = 1
    

    【讨论】:

    • 为您提供“唯一表示”值的列表,但不提供所述值的计数(您必须查看返回的记录数量)。总体上精神很好,但缺乏回答问题所需的顶级人数:)
    • @Romain 哦,当然……技术!该组中只有一个没有赞成票。就像中学体育馆一样。
    • 我明白你的意思......因此,我只想强调你的回答实际上很好......如果它完全回答了这个问题,我会投票赞成......
    【解决方案6】:

    这就是我所做的,并且成功了:

    SELECT name 
    FROM people JOIN stars ON stars.person_id = people.id 
    JOIN movies ON movies.id = stars.movie_id
    WHERE year = 2004
    GROUP BY name, person_id ORDER BY birth;
    

    注意:我在这里处理了几个表。

    CS50 问题集 7 (pset7) 9.sql 修复!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多