我正在尝试按照Teradata中的群组计算模式。以下是推荐的内容:
select retl_a
from vpp_fpp
group by dpci_lbl_t
qualify rank() over (order by count(*) desc) = 1;
但是我收到一条错误,指出所选的非聚合值必须是关联组的一部分。任何帮助表示赞赏。
以下是一个例子:
data vpp_fpp
dpci_lbl_t retl_a
a 4
a 4
a 3
b 3
b 1
Expected result:
a 4
b 2
答案 0 :(得分:0)
你只需要一个partition by
。我认为这是你想要的逻辑:
select dpci_lbl_t, retl_a
from vpp_fpp
group by dpci_lbl_t, retl_a
qualify rank() over (partition by dpci_lbl_t order by count(*) desc) = 1;
答案 1 :(得分:0)
select retl_a
from vpp_fpp
group by dpci_lbl_t
qualify rank() over (order by count(*) desc) = 1;
您的初始查询返回"非聚合值"错误,因为你只是返回一个值" retl_a"没有对它进行任何聚合计算。您可以执行类似MAX(retla_a)的操作或将其移至GROUP BY子句。
要获得你的模式......首先你需要获得每个(dpci_lbl_t,retl_a)组合的行数。你可以试试这样的东西(类似于之前的答案):
SELECT dpci_lbl_t, retl_a, COUNT(*) Count_per_pair
FROM vpp_fpp
GROUP BY 1, 2;
然后你需要添加你的QUALIFY来获得频率最高的对。像这样:
SELECT dpci_lbl_t, retl_a, COUNT(*) Count_per_pair
FROM vpp_fpp
GROUP BY 1, 2
QUALIFY RANK() OVER(PARTITION BY dpci_lbl_t ORDER BY Count_per_pair) = 1;
要处理平局的情况......你可以将其包裹在另一个SELECT周围,并且只需选择子选择" retl_a"的AVERAGE。模式值:
SELECT dpci_lbl_t, AVERAGE(retl_a) AS MyMode
FROM (
SELECT dpci_lbl_t, retl_a, COUNT(*) Count_per_pair
FROM vpp_fpp
GROUP BY 1, 2
QUALIFY RANK() OVER(PARTITION BY dpci_lbl_t ORDER BY Count_per_pair) = 1
) src
GROUP BY 1, 2;
请记住,聚合(即MAX / COUNT ... GROUP BY)及其HAVING子句在窗口函数(即RANK(),ROW_NUMBER())及其QUALIFY子句之前处理。
总结一下:
我无法访问道明系统进行验证,但请尝试一下,让我知道它是否有效。