在Postgres 9.1中,我使用了这样的窗口函数:
SELECT a.category_id, (dense_rank() over w) - 1
FROM (
_inner select_
) a
WINDOW w AS (PARTITION BY category_id ORDER BY score)
我无法弄清楚如何选择窗口范围内的元素总数。如果我只使用count(*) over w
告诉我到目前为止我在窗口中看到了多少元素而不是窗口中的总数。
我的核心问题是cume_dist()从1开始计数,而不是0,表示您之前或之前的行数。 percentile_rank()从0开始计数,就像我需要的那样,但是当它进行划分时,它也会从总行数中减去1。
答案 0 :(得分:3)
SELECT
a.category_id,
(dense_rank() over w) - 1,
count(*) over (partition by category_id) --without order by
FROM (
_inner select_
) a
WINDOW w AS (PARTITION BY category_id ORDER BY score)
From the manual on Window Functions:
还有另一个与窗口函数相关的重要概念:对于每一行,在其分区中有一组称为窗口框架的行。许多(但不是全部)窗口函数仅作用于窗口框架的行,而不是整个分区。默认情况下,如果提供ORDER BY,则该帧包含从分区开始到当前行的所有行,以及根据ORDER BY子句等于当前行的任何后续行。 省略ORDER BY时,默认框架包含分区中的所有行