Максимальное количество вместе в запросе SQL 2 - PullRequest
0 голосов
/ 27 апреля 2009

Это относится к вопросу, который я задавал ранее, и получил очень быстрый ответ ( максимальное количество вместе в SQL-запросе ). Набор проблем похож, но решение в предыдущем вопросе заставило бы меня обращаться к БД в цикле, что вызовет проблемы с производительностью. Итак, что у меня есть сейчас, после нескольких соединений:

    id | description
     0 | bla
     0 | blub
     0 | bla
     1 | blablub
     1 | bla
   ... | ...

Как вы можете видеть, теперь идентификатор больше не является первичным ключом. Что я хочу, чтобы получить наиболее часто используемое описание для каждого идентификатора в наборе результатов. Это должно выглядеть примерно так:

 id | most_popular_description | times_the_desc_appeared_for_an_id
  0 |                      bla |                                 2
  1 |                  blablub |                                 1
... |                      ... |                               ...

Ответы [ 3 ]

1 голос
/ 27 апреля 2009

Если вам нужны только самые популярные элементы, то я считаю, что это должно дать вам набор результатов, который вы ищете. Есть и другие способы сделать это, но stats_mode - это самый простой способ получить «наиболее распространенное» значение в группе (т.е. режим).

SELECT t.id,
       t.description AS most_popular_description,
       COUNT(*) AS times_the_desc_appeared_for_an_id
FROM mytable t INNER JOIN (
  SELECT id, stats_mode(description) AS desc FROM mytable GROUP BY id
) a ON t.id = a.id AND t.description = a.desc
GROUP BY t.id, t.description;

Обратите внимание, что вложенный запрос (встроенное представление) необходим, так как вы также хотите счетчик.

1 голос
/ 27 апреля 2009

Это должно сработать.

select id, description, COUNT(description)
from mytable
group by id, description
order by 3 desc
0 голосов
/ 03 мая 2009

Я думаю, что вы можете использовать аналитическую функцию dens_rank (), чтобы получить верхний N для каждого набора групп.

Примерно так:

select id, description, times_the_desc_appeared_for_an_id
from
(
  select id, description, count(description) times_the_desc_appeared_for_an_id
  dense_rank() over (partition by id, description order by count(description) desc) position
  from mytable
  group by id, description
)
where
  position <= 3
order by id, times_the_desc_appeared_for_an_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...