2013-06-25 5 views
0

Так что это мой запросMySQL Query - группировка вопрос

select 
A.search_parameters, 
reseller_count, 
reseller, 
num 

from 

(select 
search_parameters, 
count(distinct(reseller)) as reseller_count 
from all_lookups 
group by search_parameters)A 

join 

(select 
    search_parameters, 
    reseller, 
    count(*) as num 
    from all_lookups 
    group by reseller,search_parameters)B 

    on A.search_parameters=B.search_parameters 

    where a.search_parameters not like '%addsomekeywords%' 
    and a.search_parameters not like '%add-some%' 
    order by reseller_count DESC,num 
    DESC limit 1000 

По какой-то причине, результаты сгруппированы по reseller_count, но я хочу, чтобы они были сгруппированы по search_parameters. Я попытался добавить группу по A.search_paramters после предложения where, но это создает ошибку 'Выбирать выражение списка, не созданное выводом агрегации (отсутствует в предложении GROUP BY?)' Также может быть важно отметить, что я используя этот запрос в Cloudera Impala, но я подозреваю, что одни и те же правила, MySQL/синтаксис все еще применяются

Вот пример того, что я получаю

A.search_parameter|reseller_count|reseller|num 
hello    | 2   | abc |556 
hi    | 2   | tre |54 
hello    | 2   | xyz |9 
hi    | 2   | ytu |4 

и то, что я хочу

A.search_parameter|reseller_count|reseller|num 
hello    | 2   | abc | 556 
hello    | 2   | xyz | 9 
hi    | 2   | tre | 54 
hi    | 2   | ytu | 4 

Таким образом, в основном, все search_parameters' с тем же reseller_count случайным образом, вместе взятые, но я хочу, чтобы они сгруппированы по search_parameter

Благодарности

ответ

1

Помимо создания существующего запроса немного более удобным для чтения, единственное, что вы должны изменить это го e outermost order by, чтобы просто быть на параметрах search_parameters, затем num downcending. Агрегаты уже «сгруппированы» из ваших результатов запроса JOINED.

select 
     A.search_parameters, 
     A.reseller_count, 
     B.reseller, 
     B.num 
    from 
     (select 
       search_parameters, 
       count(distinct(reseller)) as reseller_count 
      from 
       all_lookups 
      group by 
       search_parameters) A 
     join 
     (select 
       search_parameters, 
       reseller, 
       count(*) as num 
      from 
       all_lookups 
      where 
        search_parameters not like '%addsomekeywords%' 
       and search_parameters not like '%add-some%' 
      group by 
       search_parameters, 
       reseller) B 

     on A.search_parameters = B.search_parameters 
    order by 
     A.search_parameters, 
     B.num DESC 
    limit 
     1000 

За отзыв/комментарий. Если вы хотите, основываясь на подсчете реселлера, то измените свой заказ, как показано ниже.

order by 
     A.reseller_count DESC, 
     A.search_parameters, 
     B.num DESC 

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

Здесь я специально изменил заголовки названий столбцов для целей разъяснения образца.

DistResell SearchParm ActualReseller NumPerReseller 
    4   X   Mary    405 
    4   X   Bob    108 
    4   X   George   107 
    4   X   Jane    98 
    4   Y   Jim    290 
    4   Y   Jill    287 
    4   Y   Mary    243 
    4   Y   Sam    164 
    3   A   Sam    201 
    3   A   Mary    187 
    3   A   Joe    146 
    2   D   Jim    73 
    2   D   Kathy   67 
    2   G   Mary    140 
    2   G   Jeff    125 

Итак, как вы можете видеть в этом примере есть два параметра поиска найдено «X» и «Y», и у каждого есть 4 торговых посредников, чтобы они выталкиваются в верхней части списка, даже хотя по алфавиту больше, чем поиск parm "A" (с числом 3). Теперь, в группе из 4 реселлеров, они являются альфа, поэтому «X» находится до «Y». Хорошо на этом уровне. Теперь, независимо от ВОЗ, реселлером, вы хотите, чтобы он отсортировался по их «количеству» для каждого отдельного реселлера.

«А» находится рядом с 3 реселлерами, без путаницы.

Затем до 2-х реселлеров с поисковыми планами «D» и «G» ... следует аналогичной иерархии, как 4, где мы уже знаем 2, находится в последней группе, затем альфа «D» и «G», , и, наконец, в каждом соответствующем «D» и «G», самом высоком «num».

Отличается ли это от того, что вы пытаетесь достичь?

+0

Результат не тот, что я ищу. Мне нужно имя каждого реселлера, соответствующее каждому параметру search_parameter и номеру каждого из этих реселлеров. например. если reseller_count = 20 для параметра search_parameter X, то мне нужно 20 столбцов с параметрами search_parameter = X и reseller_count = 20, а столбец реселлера будет иметь 20 разных имен реселлеров, и каждый из них будет иметь соответствующее число. Мой исходный запрос делает это, за исключением того, что результаты сгруппированы по reseller_count, но я хочу, чтобы он был сгруппирован с помощью search_parameters – user1893354

+0

@ user1893354, тогда я предлагаю вам обновить ваш вопрос внизу и показать некоторые примеры данных того, что у вас есть, и что вы бы искали в качестве конечного результата. Не расширяйте до 20 параметров поиска, но 3-4 в качестве основы помогут мне или кому-либо еще ... особенно по будущим поставленным вопросам. – DRapp

+0

Извините. Теперь я добавил пример. Thanks – user1893354

0

Вы можете сделать это, как это обернуть весь запрос как Tabel

SELECT q.* FROM (
SELECT 
A.search_parameters, 
reseller_count, 
reseller, 
num 

FROM 

(SELECT 
search_parameters, 
COUNT(DISTINCT(reseller)) AS reseller_count 
FROM all_lookups 
GROUP BY search_parameters)A 

JOIN 

(SELECT 
    search_parameters, 
    reseller, 
    COUNT(*) AS num 
    FROM all_lookups 
    GROUP BY reseller,search_parameters)B 

    ON A.search_parameters=B.search_parameters 

    WHERE A.search_parameters NOT LIKE '%addsomekeywords%' 
    AND A.search_parameters NOT LIKE '%add-some%' 
    ORDER BY reseller_count DESC,num 
    DESC LIMIT 1000 
) q GROUP BY q.search_parameters 

Вот пример

SELECT q.* FROM (your whole query) q GROUP BY q.any_column_in_query 
+0

Это дает мне ошибку- «AnalysisException: не может объединить« * »в списке выбора с GROUP BY: *« – user1893354

+0

Теперь посмотрим мой отредактированный ответ 'q. *' Not '*' и дайте знать, если вы столкнулись с проблемой –

+0

Проблема не устранена – user1893354