如何获取列中值的不同计数

Posted

技术标签:

【中文标题】如何获取列中值的不同计数【英文标题】:How to get distinct counts for values in columns 【发布时间】:2021-03-05 13:09:19 【问题描述】:

我有一张表,其中两列如下所示:

Name        cars_owned
Adam        Audi
David       BMW
Steve       Ford
John        Audi
Adam        Audi
....This continues on for ~1,000 rows

我想要这样的输出:

cars_owned     count
Audi           3
BMW            1
Ford           1
...

问题是行可以重复,这意味着“亚当”和“奥迪”可能一起出现 100 次,但对于“亚当”这个名字,我希望它只计为奥迪计数的一个,无论它出现多少次在表中。此外,“Adam”可能与“Audi”一起出现 20 次,但也与“BMW”一起出现 5 次,在这种情况下,我希望“Adam”只进入 Audi 计数,因为它出现的次数比 BMW 多

我能够使用此代码获得不同名称的计数 (247):

SELECT COUNT(DISTINCT Name)
FROM cars_table

现在我只需将这 247 个不同的名称分解为正确的 cars_owned 类别即可获得计数

【问题讨论】:

【参考方案1】:

您想要每个名称的最常见值,然后是分布。使用两个级别的聚合:

select car, count(*) as num_names, sum(cnt) as num_cars
from (select name, car, count(*) as cnt,
             row_number() over (partition by name order by count(*) desc) as seqnum
      from cars c
      group by name, car
     ) nc
where seqnum = 1
group by car;

注意:如果名称与最常见的汽车相同,则返回一个任意值。

【讨论】:

以上是关于如何获取列中值的不同计数的主要内容,如果未能解决你的问题,请参考以下文章

如何获取列中值的不同百分比并将它们相加以分配到新的 SQL 列中?

如何使用linq获取表中值的计数

如何获取列中每个不同值的计数? [复制]

如何使用 Linq 获取列中每个不同值的计数

如何使用 OVER() 函数获取列中值的总和?

如何获取列表中值的列总数 - 匿名类型的两倍