在 SQL 列中查找最常用的值

如何在 SQL 表中找到给定列中最常见的值?

例如,对于这个表,它应该返回 two,因为它是最常见的值:

one
two
two
three
339152 次浏览

试试这样:

SELECT       `column`
FROM     `your_table`
GROUP BY `column`
ORDER BY COUNT(*) DESC
LIMIT    1;
SELECT
<column_name>,
COUNT(<column_name>) AS `value_occurrence`


FROM
<my_table>


GROUP BY
<column_name>


ORDER BY
`value_occurrence` DESC


LIMIT 1;

替换 <column_name><my_table>。如果想看到列中最常见的 N值,请增加 1

用于 SQLServer。

因为它没有限制命令支持。

Yo 可以使用 top 1命令在这种情况下查找特定列中的最大出现值(value)

SELECT top1
`value`,
COUNT(`value`) AS `value_occurrence`
FROM
`my_table`
GROUP BY
`value`
ORDER BY
`value_occurrence` DESC;

让我们考虑表名称为 tblperson,列名称为 city。我要从“城市”栏中找出重复次数最多的城市:

 select city,count(*) as nor from tblperson
group by city
having count(*) =(select max(nor) from
(select city,count(*) as nor from tblperson group by city) tblperson)

这里的 nor是一个别名。

如果不能使用 LIMIT 或 LIMIT 不是查询工具的选项。您可以使用“ ROWNUM”代替,但是您需要一个子查询:

SELECT FIELD_1, ALIAS1
FROM(SELECT FIELD_1, COUNT(FIELD_1) ALIAS1
FROM TABLENAME
GROUP BY FIELD_1
ORDER BY COUNT(FIELD_1) DESC)
WHERE ROWNUM = 1

假设 Table 是“ SalesLT.Customer”,并且您试图找出的列是“ CompanyName”,而 AggCompanyName是别名。

Select CompanyName, Count(CompanyName) as AggCompanyName from SalesLT.Customer
group by CompanyName
Order By Count(CompanyName) Desc;

下面的查询似乎对我在 SQLServer 数据库中很有用:

select column, COUNT(column) AS MOST_FREQUENT
from TABLE_NAME
GROUP BY column
ORDER BY COUNT(column) DESC

结果:

column          MOST_FREQUENT
item1           highest count
item2           second highest
item3           third higest
..
..

如果您有一个 ID 列,并且您希望从另一列中为每个 ID 查找最重复的类别,那么您可以使用以下查询,

表:

Table content

质疑:

SELECT ID, CATEGORY, COUNT(*) AS FREQ
FROM TABLE
GROUP BY 1,2
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY FREQ DESC) = 1;

结果:

Query result

我喜欢用的一种方法是:

select *<given_column>*,COUNT(*<given_column>*)as VAR1 from Table_Name


group by *<given_column>*


order by VAR1 desc


limit 1

返回所有最常见的行,以防出现平局

查找 mysql 中最常用的值,如果出现 tie ,则显示 all,这给出了两种可能的方法:

  1. 标量子查询:

    SELECT
    "country",
    COUNT(country) AS "cnt"
    FROM "Sales"
    GROUP BY "country"
    HAVING
    COUNT("country") = (
    SELECT COUNT("country") AS "cnt"
    FROM "Sales"
    GROUP BY "country"
    ORDER BY "cnt" DESC,
    LIMIT 1
    )
    ORDER BY "country" ASC
    
  2. 使用自 MySQL 8 + 以来可用的 RANK窗口函数:

    SELECT "country", "cnt"
    FROM (
    SELECT
    "country",
    COUNT("country") AS "cnt",
    RANK() OVER (ORDER BY COUNT(*) DESC) "rnk"
    FROM "Sales"
    GROUP BY "country"
    ) AS "sub"
    WHERE "rnk" = 1
    ORDER BY "country" ASC
    

    这种方法可以比第一种方法节省第二次重新计票。

    RANK的工作原理是对所有行进行排名,这样,如果有两行位于顶部,两行都得到排名 1。所以它基本上直接解决了这种类型的用例。

    RANK也可以在 SQLite 和 PostgreSQL 上使用,我认为它可能是 SQL 标准,不确定。

在上面的查询中,我还按 country排序,以得到更确定的结果。

在 SQLite 3.34.0、 PostgreSQL 14.3和 GitHub 上游上进行了测试。

每个 GROUP BY组最常见