sql - 前 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
你能帮忙吗?这是非常大的数据表,需要代码高效。非常感谢您的时间和提前帮助。
解决方案
我建议使用聚合和子查询:
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');
推荐阅读
- c# - 在 C# 中动态加载 c dll
- java - 自定义Adapter:在getView方法中,当convertView作为View变量接收时,人为什么要重新赋值给另一个View对象
- azure - 导入停止 Azure V2 VM 运行手册
- floating-point - 为什么浮点数的指数部分这么复杂?
- android - 如何在 Android 的 Chrome 中读取纯原始麦克风数据?
- php - 单击提交后,表单到邮件操作不起作用
- php - 字符串编号比较
- c - 如何将带有 h.264 的原始 PCM 复用到带有 ffmpeg API 的 MP4?
- python - 在Python中使用模糊匹配合并多列上的数据框
- mysql - 查询时如何使用sequelize迁移模型?