Поиск наиболее распространенных элементов в год в SQL - PullRequest
1 голос
/ 10 октября 2019

У меня есть таблица с тремя атрибутами: год, порода и цвет. Например:

╔════╤═════════╤═══════╤══════╗
║ 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 ]

1 голос
/ 10 октября 2019

Мы можем попробовать использовать RANK, если ваша версия SQLite 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 не поддерживает оконные функции, и вы ожидаете, что требования к отчетам аналогичнык этому движению вперед, затем рассмотрите возможность обновления.

0 голосов
/ 10 октября 2019

Ниже показано, как вычислять для каждого года наиболее часто встречающиеся породы без необходимости использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...