哪个 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
之后,将 a
或 b
添加到 ORDER BY
是没有意义的,例如 .
所以我们简化为:
count(*) OVER (PARTITION BY a, b ORDER BY c) * 10
dense_rank() OVER (PARTITION BY a, b ORDER BY c) * 10
这两个只等价于c
是UNIQUE
。否则他们不是。
您需要准确定义数字的含义,并显示您的 table 定义和确切的查询,因为联接会引入重复值和 NULL 值。
row_numer()
或 rank()
相似 window functions ...
它们的性能几乎相同。
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
之后,将 a
或 b
添加到 ORDER BY
是没有意义的,例如
所以我们简化为:
count(*) OVER (PARTITION BY a, b ORDER BY c) * 10
dense_rank() OVER (PARTITION BY a, b ORDER BY c) * 10
这两个只等价于c
是UNIQUE
。否则他们不是。
您需要准确定义数字的含义,并显示您的 table 定义和确切的查询,因为联接会引入重复值和 NULL 值。
row_numer()
或 rank()
相似 window functions ...
它们的性能几乎相同。