哪个 window 函数更快?

Which window function is faster?

count(*) OVER (PARTITION BY a, b ORDER BY a, b, c) * 10

这产生与以下相同的结果:

dense_rank() OVER (PARTITION BY a, b ORDER BY a, b, c) * 10

在这样的查询中使用:

SELECT
    dense_rank() OVER (ORDER BY a, b) ,
    a || b,
    count(*) OVER (
        PARTITION BY a, b
        ORDER BY a, b, c
    ) * 10 ,
    a2,
    b1,
    c1,
    cc1,
    c2,
FROM
  join ....
ORDER BY 1, 6;

我对我的查询结果很满意。
但是我应该欣赏一种方法而不是另一种方法吗?为什么?

PARTITION BY a, b 之后,将 ab 添加到 ORDER BY 是没有意义的,例如 .

所以我们简化为:

count(*)     OVER (PARTITION BY a, b ORDER BY c) * 10
dense_rank() OVER (PARTITION BY a, b ORDER BY c) * 10

这两个只等价于cUNIQUE。否则他们不是。

您需要准确定义数字的含义,并显示您的 table 定义和确切的查询,因为联接会引入重复值和 NULL 值。

row_numer()rank() 相似 window functions ...

它们的性能几乎相同。