【问题标题】:SQL to find the number of distinct values in a columnSQL查找列中不同值的数量
【发布时间】:2008-09-26 19:52:48
【问题描述】:

我可以通过以下方式选择列中的所有不同值:

  • SELECT DISTINCT column_name FROM table_name;
  • SELECT column_name FROM table_name GROUP BY column_name;

但是如何从该查询中获取行数?是否需要子查询?

【问题讨论】:

    标签: sql distinct


    【解决方案1】:

    您可以在COUNT 聚合函数中使用DISTINCT 关键字:

    SELECT COUNT(DISTINCT column_name) AS some_alias FROM table_name
    

    这将只计算该列的不同值。

    【讨论】:

    • 很好,我不知道你可以把 distinct 关键字放在那里。
    • 也适用于群组select A,COUNT(DISTINCT B) from table group by A
    • 您能否将此示例扩展为在多个列上不同?
    • 11 年后,这仍然有用
    【解决方案2】:

    这将为您提供不同的列值和每个值的计数。我通常发现我想知道这两条信息。

    SELECT [columnName], count([columnName]) AS CountOf
    FROM [tableName]
    GROUP BY [columnName]
    

    【讨论】:

      【解决方案3】:

      注意 Count() 会忽略 null 值,所以如果你需要允许 null 作为它自己的不同值,你可以做一些棘手的事情,比如:

      select count(distinct my_col)
             + count(distinct Case when my_col is null then 1 else null end)
      from my_table
      /
      

      【讨论】:

      • 我真的认为您的案例陈述的意思是:case when my_col is null then 1 else my_col end
      • 为清楚起见:SELECT my_col, COUNT(my_col) + COUNT(CASE WHEN my_col IS NULL THEN 1 ELSE NULL END) as CountOf from my_Table GROUP BY my_col
      • count(*) 包括空值
      • @PragmaticProgrammer 我猜是这样,但没有空行,只有空值,count(*) 是行数。
      【解决方案4】:

      column_name 的唯一值的 sql 总和并按频率排序:

      SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY 2 DESC;
      

      【讨论】:

      • 绝对是 IMO 的最佳答案
      【解决方案5】:
      SELECT COUNT(DISTINCT column_name) FROM table as column_name_count;
      

      你必须计算那个不同的 col,然后给它一个别名。

      【讨论】:

        【解决方案6】:
        select count(*) from 
        (
        SELECT distinct column1,column2,column3,column4 FROM abcd
        ) T
        

        这将给出不同列组的计数。

        【讨论】:

          【解决方案7】:
          select Count(distinct columnName) as columnNameCount from tableName 
          

          【讨论】:

            【解决方案8】:

            使用以下 SQL 我们可以得到 Oracle 11g 中的不同列值计数

            select count(distinct(Column_Name)) from TableName
            

            【讨论】:

              【解决方案9】:

              MS SQL Server 2012之后,也可以使用窗口功能了。

              SELECT column_name, COUNT(column_name) OVER (PARTITION BY column_name) 
              FROM table_name
              GROUP BY column_name
              

              【讨论】:

                【解决方案10】:

                Presto using OVER 中执行此操作:

                SELECT DISTINCT my_col,
                                count(*) OVER (PARTITION BY my_col
                                               ORDER BY my_col) AS num_rows
                FROM my_tbl
                

                使用这种基于OVER 的方法当然是可选的。在上面的 SQL 中,我发现指定 DISTINCTORDER BY 是必要的。

                注意:根据docs,使用GROUP BY 可能更有效。

                【讨论】:

                  【解决方案11】:
                  select count(distinct(column_name)) AS columndatacount from table_name where somecondition=true
                  

                  您可以使用此查询来计算不同/不同的数据。

                  【讨论】:

                    【解决方案12】:

                    Count(distinct({fieldname})) 是多余的

                    Simply Count({fieldname}) 为您提供该表中所有不同的值。它不会(许多人认为)只是给你桌子的计数[即与表中的 Count(*) 不同]

                    【讨论】:

                    • 不,这是正确的。 count(field) 返回 fieldnot null 的行数。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-09-20
                    • 2021-12-30
                    • 2021-02-26
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多