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');
我正在使用 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');