首页 > 解决方案 > 前 n 个子组的 Teradata SQL 计数

问题描述

我正在使用 TD v15。我有一个如下表 - 每行都是一条记录,我想按以下方式执行 Count :

在问题栏中:我有 4 个“A”、5 个“B”、3 个“C”和 2 个“D”。从其中选择前 2 个,即 A 和 B。将其余问题分组为“OtherQ” - 将它们放在结果问题列中。

在Change Column中,我有2个'AA',3个'AB',2'AC',2个'AD',4个'AE'和2个'AG',选择前2个,它们是AE和AB,将其余的分组更改作为“其他” - 将它们放在结果更改列中。

然后,根据...

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) 和其他更改,此外,它还计算 A&B 和 OtherQ 的 Pass&Fail。

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

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

标签: sqlteradata

解决方案


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

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

推荐阅读