在SQL中查找一年中最常见的元素

时间:2019-10-10 04:53:19

标签: sql sqlite subquery

我有一个表,其中包含三个属性,年份,品种和颜色。例如:

╔════╤═════════╤═══════╤══════╗
║ id │ breed   │ color │ year ║
╠════╪═════════╪═══════╪══════╣
║ 01 │ pug     │ black │ 2019 ║
╟────┼─────────┼───────┼──────╢
║ 02 │ pug     │ black │ 2019 ║ 
╟────┼─────────┼───────┼──────╢
║ 03 │ poodle  │ brown │ 2019 ║
╟────┼─────────┼───────┼──────╢
║ 04 │ pug     │ white │ 2013 ║
╟────┼─────────┼───────┼──────╢
║ 05 │ poodle  │ brown │ 2013 ║ 
╟────┼─────────┼───────┼──────╢
║ 06 │ poodle  │ white │ 2010 ║  
╟────┼─────────┼───────┼──────╢
║ 07 │ bulldog │ white │ 2010 ║
╟────┼─────────┼───────┼──────╢
║ 08 │ husky   │ brown │ 2012 ║
╟────┼─────────┼───────┼──────╢
║ 09 │ pug     │ black │ 2013 ║
╟────┼─────────┼───────┼──────╢
║ 10 │ husky   │ brown │ 2014 ║
╚════╧═════════╧═══════╧══════╝

创建表格

create table dogs (
 id     char(5),
 breed      char(10),
 year       int,
 color      char(10),
 primary key (id)
 );

对于狗的每一年,我需要找到采用的最频繁的品种和最频繁的狗颜色,如果有联系,请列出所有联系。我尝试了以下方法:

SELECT d.year, d.breed,COUNT(d.breed),d.color,COUNT(v.color)
FROM dogs d
GROUP BY d.year,d.breed,d.color;

从本质上讲,这使我每年都能获得不同的品种以及每种颜色有多少种。我将如何处理上述问题?我也在使用SQLite。

2 个答案:

答案 0 :(得分:1)

如果您的SQLite版本是RANK或更高版本,我们可以尝试使用3.25.0

WITH cte AS (
    SELECT d.year, d.breed, d.color, COUNT(d.breed) AS cnt,
        RANK() OVER (ORDER BY COUNT(d.breed) DESC) rnk
    FROM dogs d
    GROUP BY d.year, d.breed, d.color
)

SELECT year, breed, color, cnt
FROM cte
WHERE rnk = 1;

如果您的SQLite版本不支持窗口功能,并且您希望报表功能与此类似,请考虑升级。

答案 1 :(得分:0)

下面显示了如何计算每年最频繁的品种, 无需RANK。

最简单的方法是单独进行查询(确定结构)以确定每年最频繁的颜色。

with frequencies as (select year, breed, count(*) as breedcount from dogs GROUP BY breed, year),
     maxes       as (select year, max(breedcount) mx from frequencies GROUP BY year)
select frequencies.year year, breed, mx
     from frequencies JOIN maxes ON frequencies.year = maxes.year
     where breedcount = mx ORDER BY year ;

输出(带标题)

year|breed|mx
2010|bulldog|1
2010|poodle|1
2012|husky|1
2013|pug|2
2014|husky|1
2019|pug|2