使用Teradata进行模式计算

时间:2017-11-13 16:03:57

标签: sql teradata mode

我正在尝试按照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 

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子句之前处理。

总结一下:

  1. COUNT / GROUP BY函数获取每个(dpci_lbl_t,retl_a)组合的行数。这表示每个" retl_a"值发生在" dpci_lbl_t"组。
  2. RANK()函数然后将结果行分区为" dpci_lbl_t",通过" Count_per_pair"对它们进行排序。值,并根据该值分配排名。
  3. 然后QUALIFY过滤掉该结果,只返回RANK()= 1的行。将其视为窗口函数的WHERE子句。
  4. 外部SELECT中的AVERAGE()返回"模式"价值,包括任何关系的平均值。
  5. 我无法访问道明系统进行验证,但请尝试一下,让我知道它是否有效。