【问题标题】:Teradata SQL count on Top n subgroups前 n 个子组的 Teradata SQL 计数
【发布时间】:2018-06-27 23:34:19
【问题描述】:

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

在问题栏中:我有 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 的通过和失败。

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

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

【问题讨论】:

  • 如果多个问题或更改共享相同的计数怎么办,例如6,6,5?你的桌子有多大,有多少问题/计数组合?
  • @dnoeth 你好!好点子!由于有 500k 行,组合是 30 个问题乘以 50 个更改,我想获得相同计数的机会很小:)

标签: sql teradata


【解决方案1】:

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

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

【讨论】:

  • 谢谢~逻辑很棒。我稍作调整以使代码运行 :) 再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2017-03-09
  • 2021-06-05
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
相关资源
最近更新 更多