Количество запросов SQL, деленное на различное количество одинаковых запросов - PullRequest
0 голосов
/ 26 февраля 2012

Возникли проблемы с некоторым SQL.

Возьмем, к примеру, следующий результат:

LOC_CODE     CHANNEL            
------------ -------------------- 
3ATEST-01    CHAN2            
3ATEST-01    CHAN3            
3ATEST-02    CHAN4            

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

Пример результата, который мне нужен:

 CHANNEL          COUNT
 ---------------- ----------
 CHAN2            0.5
 CHAN3            0.5
 CHAN4            1

Выше приведено объяснение, что CHAN2 появляется следующимв «3ATEST-01», но LOC_CODE из «3ATEST-01» появляется дважды, поэтому счет следует разделить на 2.

Я знаю, что могу сделать это, в основном, дублируя запрос с другим счетом,но базовый запрос довольно сложный и не очень-то хочет навредить производительности.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!

Ответы [ 4 ]

4 голосов
/ 26 февраля 2012

Попробуйте:

select channel, 
       count(*) over (partition by channel, loc_code)
        / count(*) over (partition by loc_code) as count_ratio
from my_table
1 голос
/ 26 февраля 2012

Сначала найдите запрос, который даст вам правильные результаты.Затем посмотрите, можно ли его оптимизировать.Я предполагаю, что это трудно оптимизировать, так как вам нужны две разные группировки, одна на Channel и одна предварительно Loc_Code.

Я даже не уверен, что это соответствует вашему описанию:

SELECT t.CHANNEL
     , COUNT(*) / SUM(grp.TotalCount)
FROM my_table t 
  JOIN 
      ( SELECT LOC_CODE
             , COUNT(*) TotalCount        --- or is it perhaps?:
                                          --- COUNT(DISTINCT CHANNEL)
        FROM my_table
        GROUP BY LOC_CODE
      ) grp 
     ON grp.LOC_CODE = t.LOC_CODE
GROUP BY t.CHANNEL
1 голос
/ 26 февраля 2012
SELECT t.CHANNEL, COUNT(*) / gr.TotalCount
FROM my_table t JOIN (
    SELECT LOC_CODE, COUNT(*) TotalCount
    FROM my_table
    GROUP BY LOC_CODE
) gr USING(LOC_CODE)
GROUP BY t.LOC_CODE, t.CHANNEL

Создать индекс на (LOC_CODE, CHANNEL)

Если дублирующих каналов нет, замените COUNT(*) / gr.TotalCount на 1 / gr.TotalCount и удалите предложение GROUP BY

0 голосов
/ 26 февраля 2012

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

SELECT L1.CHANNEL, 1/COUNT(L2.LOC_CODE) 
FROM Locations L1
LEFT JOIN Locations L2 ON L1.LOC_CODE = L2.LOC_CODE 
GROUP BY L1.CHANNEL, L1.LOC_CODE

Demo здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...