Teradata SQL 依靠前 n 个子组

Teradata SQL count on Top n subgroups

我正在使用 TD v15。我有一个如下所示的 table - 每行都是一条记录,我想按以下方式执行计数:

在问题栏中:我有4个'A'、5个'B'、3个'C'和2个'D'。 Select 他们中的前 2 名,即 A 和 B。将其余问题分组为 'OtherQ' - 将它们放在结果问题列中。

在更改列中,我有 2 'AA'、3 'AB'、2'AC'、2 'AD'、4 'AE' 和 2 'AG' , select 前 2 名,即 AE 和 AB,将其余更改分组为 'Other' - 将它们放在结果更改列中。

然后,按照...

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) 和具有前 2 个更改 (AE&AB) 和其他更改的 OtherQ,此外,它计入 A&B 和 OtherQ 的通过和失败。

Count 的总和为 20,这应该与上面 table 中的第 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

你能帮忙吗?这是非常大的数据 table,需要代码高效。非常感谢您的时间和提前帮助。

我建议使用聚合和子查询:

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');