Счетчик SQL Teradata в первых n подгруппах - PullRequest
0 голосов
/ 28 июня 2018

Я использую TD v15. У меня есть таблица, как показано ниже - каждая строка представляет собой одну запись, я хочу выполнить подсчет следующим образом:

В колонке вопросов: у меня есть 4 «A», 5 «B», 3 «C» и 2 «D». Выберите из них топ-2, которые являются A & B. Сгруппируйте остальные вопросы как «OtherQ» - поместите их в столбец «Результат».

В столбце «Изменение» у меня есть 2 «АА», 3 «АБ», 2 «АС», 2 «АД», 4 «АЕ» и 2 «АГ», выберите 2 лучших группы АЕ и АВ, группа остальные изменится на «Другое» - поместите их в столбец «Изменение результатов».

Тогда посчитайте согласно ...

Question    Result Change  
    A         Pass   AG          
    A         Pass   AE           
    A         Pass   AA           
    A         Pass   AB       
    B         Pass   AC      
    B         Pass   AG        
    B         Pass   AB         
    B         Pass   AE       
    B         Pass   AD
    B         Pass   AA
    C         Pass   AB
    C         Pass   AC
    C         Pass   AD
    D         Pass   AE
    D         Pass   AE
    A         Fail   Null
    A         Fail   Null
    C         Fail   Null
    E         Fail   Null
    B         Fail   Null

Это желаемый результат, он засчитывается в топ-2 вопросов (A & B) и OtherQ с топ-2 изменениями (AE & AB) и другими изменениями, а также учитывает Pass & Fail для A & B и OtherQ.

Сумма Count равна 20, это должно соответствовать 20 отдельным строкам в таблице выше.

 Question    Result Change    Count
    A         Pass   AE         1
    A         Pass   AB         1
    A         Pass   Other      2
    B         Pass   AE         1
    B         Pass   AB         1
    B         Pass   Other      4   
  OtherQ      Pass   AE         2
  OtherQ      Pass   AB         1
  OtherQ      Pass   Other      2
    A         Fail   Null       2
    B         Fail   Null       1
  OtherQ      Fail   Null       2

Не могли бы вы помочь? Это очень большая таблица данных, код должен быть эффективным. Большое спасибо за ваше время и помощь заранее.

1 Ответ

0 голосов
/ 28 июня 2018

Я бы предложил использовать агрегаты и подзапросы:

select coalesce(tq.question, 'Other') as question
       (case when t.change is null then null
             else coalesce(tch.change, 'Other') 
        end) as change,
       count(*)
from t left join
     (select question, count(*) as cnt,
             row_number() over (order by count(*) desc) as seqnum
      from t
      group by question
     ) tq
     on tq.question = t.question and tq.seqnum <= 2 left join
     (select change, count(*) as cnt,
             row_number() over (order by count(*) desc) as seqnum
      from t
      group by change
     ) tch
     on tch.change = t.change and tch.seqnum <= 2
group by coalesce(tq.question, 'Other'),
         coalesce(tch.change, 'Other');  
...