2016-10-06 4 views
1

Извините, если это основной вопрос.SQL запрос подсчета

В принципе, у меня есть таблица, которая выглядит следующим образом, ниже основной образец

store-ProdCode-result 
13p  I10x 5 
13p  I20x 7 
13p  I30x 8 
14a  K38z 23 
17a  K38z 23 

мой набор данных имеет около 100 000 записей.

То, что я пытаюсь сделать, это для каждого магазина, чтобы найти лучшие 10 prodCode.

Я не уверен в том, как это сделать, но то, что я попытался было:

select s_code as store, prod_code,count (prod_code) 
from top10_secondary 
where prod_code is not null 
group by store,prod_code 
order by count(prod_code) desc limit 10 

это дает мне что-то совсем другое, и я не уверен в том, как я идти о достижении моего окончательного результата.

Вся помощь приветствуется.

Благодаря

Ожидаемый результат должен быть: для каждого магазина (s_code) отображения топ 10 prodcode

так:.

store--prodcode--result 
1a  abc  5 
1a  abd  4 
2a  dgf  1 
2a  ldk  6 

(10 раз до следующего магазина кода)

+1

Ожидаемый результат должен быть? –

+0

Моя кишка говорит мне предлагать заглянуть в функцию PIVOT (в зависимости от того, какую версию SQL вы используете), но, как указано выше, ожидаемый результат был бы полезен. –

+0

@juergend Я отредактировал свое сообщение с ожидаемым результатом – timz

ответ

0

Это хороший случай для функций Window.

SELECT 
    s_code, 
    prod_code, 
    prod_count 
FROM 
    (

     SELECT 
      s_code, 
      prod_code, 
      prod_count, 
      RANK() OVER (PARTITION BY s_code ORDER BY prod_Count DESC) as prod_rank 
     FROM 
      (SELECT s_code as store, prod_code, count(prod_Code) prod_count FROM table GROUP BY s_code, prod_code) t1 
    ) t2 
WHERE prod_rank <= 10 

Внутренний самый запрос получает количество каждого продукта в магазине. Второй внутренний запрос больше определяет ранг для этих продуктов для каждого магазина на основе этого счета. Тогда внешний запрос большинства ограничивает результаты на основе этого ранга.

+0

заменить t1 и t2 на мое имя таблицы? @JNevill – timz

+0

Я побежал и получил ошибку: ERROR: ошибка синтаксиса в точке или рядом с «Таблица» – timz

+0

«table» необходимо заменить на имя вашей таблицы. 't1' и' t2' - просто псевдонимы (имена для этих подзапросов), вы можете изменить их на все, что вам нравится. – JNevill

0

Вы можете использовать таблицу дважды в предложении FROM, один раз для данных, и один раз, чтобы подсчитать, сколько записей имеет меньше результатов для этого хранилища.

SELECT a.s_code, a.prod_code, count(*) 
    FROM top10_secondary a 
     LEFT OUTER JOIN top10_secondary b 
     ON a.s_code = b.s_code 
     AND b.result < a.result 
GROUP BY a.s_code, a.prod_code 
HAVING count(*) < 10 

С помощью этой методики вы можете получить более 10 записей в хранилище, если значение 10-го результата существует несколько раз. Поскольку правило ограничения просто «включает запись, если существует меньше 10 записей с результирующими значениями, чем у меня»

Похоже, что в вашем случае «результат» - это рейтинг, поэтому они не будут дублироваться на каждый магазин ,

+0

Я получаю следующую ошибку: ERROR: column b.result не существует – timz

+0

У меня нет точных имен столбцов для вашей таблицы. Является ли таблица с именем top10_secondary и имеет ли она столбец «результат»? Если это нечто иное, как r_code, тогда вы захотите переименовать оба места, в которых используется «результат». – efreed

+0

таблица называется top10_secondary .. поле результата получается из результата count (prod_code) в результате. также получить ERROR: схема «b» не существует – timz

Смежные вопросы