如何获取列中值的不同计数
How to get distinct counts for values in columns
我有一个 table,其中两列如下所示:
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
...
问题是行可以重复,这意味着 'Adam' 和 'Audi' 可能一起出现 100 次,但是对于名称 'Adam' 我希望它只算作奥迪的一个不管它在 table 中出现多少次都算在内。此外,'Adam' 可能与 'Audi' 一起出现 20 次,但也可能与 'BMW' 一起出现 5 次,在这种情况下,我希望 'Adam' 只进入奥迪计数,因为它出现的次数更多比宝马
我能够使用此代码获得不同名称的计数 (247):
SELECT COUNT(DISTINCT Name)
FROM cars_table
现在我只需要将这 247 个不同的名称分成正确的 cars_owned 类别即可获得计数
您需要每个名称的最常见值,然后是分布。使用两级聚合:
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;
注意:如果有最常见的汽车名字并列,这个returns一个任意值。
我有一个 table,其中两列如下所示:
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
...
问题是行可以重复,这意味着 'Adam' 和 'Audi' 可能一起出现 100 次,但是对于名称 'Adam' 我希望它只算作奥迪的一个不管它在 table 中出现多少次都算在内。此外,'Adam' 可能与 'Audi' 一起出现 20 次,但也可能与 'BMW' 一起出现 5 次,在这种情况下,我希望 'Adam' 只进入奥迪计数,因为它出现的次数更多比宝马
我能够使用此代码获得不同名称的计数 (247):
SELECT COUNT(DISTINCT Name)
FROM cars_table
现在我只需要将这 247 个不同的名称分成正确的 cars_owned 类别即可获得计数
您需要每个名称的最常见值,然后是分布。使用两级聚合:
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;
注意:如果有最常见的汽车名字并列,这个returns一个任意值。