【发布时间】:2015-10-15 19:12:41
【问题描述】:
我有一个名为 cnst_chrctrstc_abc 的表,每行包含 10 列 (equ_gender1 - bb_population_flag),其中包含数值 (count)。 我想从这 10 个数字列中的每一行中获取最多 5 个值。
我的查询如下所示..
SEL
FROM
(
SEL
SUM(CASE WHEN COALESCE(act.equ_gender1,'') = COALESCE(inact.equ_gender1,'') THEN 0 ELSE 1 END ) AS equ_gender1_chg_cnt,
SUM(CASE WHEN COALESCE(act.exp_ex_bmyr1,'') = COALESCE(inact.exp_ex_bmyr1,'') THEN 0 ELSE 1 END ) AS exp_ex_bmyr1_chg_cnt,
SUM(CASE WHEN COALESCE(act.equ_age1,'') = COALESCE(inact.equ_age1,'') THEN 0 ELSE 1 END ) AS equ_age1_chg_cnt,
SUM(CASE WHEN COALESCE(act.maritalstatus1,'') = COALESCE(inact.maritalstatus1,'') THEN 0 ELSE 1 END ) AS maritalstatus1_chg_cnt,
SUM(CASE WHEN COALESCE(act.person_type1,'') = COALESCE(inact.person_type1,'') THEN 0 ELSE 1 END ) AS person_type1_chg_cnt,
SUM(CASE WHEN COALESCE(act.homeowner,'') = COALESCE(inact.homeowner,'') THEN 0 ELSE 1 END ) AS homeowner_chg_cnt,
SUM(CASE WHEN COALESCE(act.dwelling_size,'') = COALESCE(inact.dwelling_size,'') THEN 0 ELSE 1 END ) AS dwelling_size_chg_cnt,
SUM(CASE WHEN COALESCE(act.lengthofresidence,'') = COALESCE(inact.lengthofresidence,'') THEN 0 ELSE 1 END ) AS lengthofresidence_chg_cnt,
SUM(CASE WHEN COALESCE(act.childrenage0_18,'') = COALESCE(inact.childrenage0_18,'') THEN 0 ELSE 1 END ) AS childrenage0_18_chg_cnt,
SUM(CASE WHEN COALESCE(act.bb_population_flag,'') = COALESCE(inact.bb_population_flag,'') THEN 0 ELSE 1 END ) AS bb_population_flag
FROM
(SEL * FROM arc_mdm_Tbls.cnst_chrctrstc_abc WHERE load_id=1024 AND cnst_chrctrstc_end_dt='9999-12-31' (DATE))act
LEFT JOIN
(SEL * FROM arc_mdm_Tbls.cnst_chrctrstc_abc WHERE load_id=1024 AND cnst_chrctrstc_end_dt<'9999-12-31' (DATE)
QUALIFY ROW_NUMBER() OVER (PARTITION BY cnst_mstr_id ORDER BY cnst_chrctrstc_strt_ts DESC)=1
)inact
ON act.cnst_mstr_id = inact.cnst_mstr_id
)X
我知道 SEL GREATEST 会在每一行中产生最大值。但我想要 5 个最高值并为它们分配一个排名。
对于某些行,前五列可能包含前 5 个值,而对于某些后五列,即 bb_population_flag 的房主可能包含前 5 个值。
所以如果来自 cnst_chrctrstc_abc 的列和值如下所示
cdi_batch_id | a | b | c | d | e | f | g | h | i |j
1024 |116|105|102|100|117|119|108|104|101|121
所以选择查询应该返回我列 j,f,e,a,g 具有前 5 个值。 然后我会相应地为他们分配一个等级。
应该使用 unpivot 或其他东西来完成吗? 提前致谢。
【问题讨论】:
-
好的,很多问题:#1:您正在将行的当前版本与之前的版本进行比较(这可能可以使用 OLAP 函数重写)。 #2:您当前的查询返回单行,因此您可能需要单独的行而不是
SUM。 #3:你的结果应该返回 5 行,每列应该有五个最高值?还是每列五行(也只有这一列或其他列)?如果有重复值怎么办? -
是的。第二个假设是正确的。实际上,我想选择前五个值,例如 SEL GREATEST( ----- ),然后将排名分配给这些列值并插入到其他表中。
-
您可以添加示例数据和预期结果吗?
-
请看一下。谢谢。
-
最后一个问题:您的 Teradata 版本是什么?
标签: teradata