Как считать группы строк и отображать верх / низ 3 - PullRequest
8 голосов
/ 19 февраля 2010

Я понимаю, что это, вероятно, будет легко, но мой SQL в лучшем случае базовый.

Допустим, у меня есть таблица, содержащая список заказов, где item_id является одним из столбцов. Мне нужно отобразить 3 наименее (или 3 самых) популярных заказа товара.

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

Ответы [ 4 ]

11 голосов
/ 19 февраля 2010

In Sql Server :

SELECT TOP 3 item_id, COUNT(*) as itemcount 
FROM table 
GROUP BY item_id ORDER BY itemcount

и добавить DESC для заказа спуска

3 голосов
/ 19 февраля 2010

Для сервера SQL:

select    top 3 item_id, count(item_id) 
from      table 
group by  item_id 
order by  count(item_id) desc

даст вам 3 самых популярных item_id

, используя:

order by  count(item_id) 

даст вам 3 наименее популярных item_id

3 голосов
/ 19 февраля 2010
select item_id, count(*)
from table
group by item_id;

даст вам весь список.

Внизу 3:

select item_id
from (
    select item_id, count(*) as cnt
    from table
    group by item_id
    order by cnt
) where rownum < 4;

Вверху 3:

select item_id
from (
    select item_id, count(*) as cnt
    from table
    group by item_id
    order by cnt desc
) where rownum < 4;

ПРИМЕЧАНИЕ: этот синтаксис предназначен для Oracle.Используйте LIMIT, если у вас MySql или TOP, если у вас есть sql-сервер.

ORDER BY отсортирует ваши результаты.Порядок возрастания по умолчанию, поэтому используйте desc, если хотите получить наибольшее значение.

GROUP BY (при использовании с count (*)) будет подсчитывать группы похожих объектов

где rownum <4: Это оракулы имели ОГРАНИЧЕНИЕ.Возвращает первые 3 строки выполненного запроса.Где предложения выполняются перед предложениями порядка, поэтому вы должны сделать это как вложенный запрос.</p>

2 голосов
/ 19 февраля 2010

В MySQL:

SELECT  item_id, COUNT(*) AS cnt
FROM    orders
GROUP BY
        item_id
ORDER BY
        cnt DESC
LIMIT 3
...