使用窗口函数对Postgresql中的数据进行分区
我有桌子“Z”:使用窗口函数对Postgresql中的数据进行分区,postgresql,window-functions,Postgresql,Window Functions,我有桌子“Z”: id|zone|name ------------ 1 | 34 | a 2 | 14 | b 3 | 99 | c 4 | 99 | d 5 | 90 | e 6 | 99 | c 质疑 返回: id|zone|name|dense_rank ----------------------- 1 | 34 | a | 2 2 | 14 | b | 1 3 | 99 | c | 4 4 | 99 | d | 4 5 | 90 |
id|zone|name
------------
1 | 34 | a
2 | 14 | b
3 | 99 | c
4 | 99 | d
5 | 90 | e
6 | 99 | c
质疑
返回:
id|zone|name|dense_rank
-----------------------
1 | 34 | a | 2
2 | 14 | b | 1
3 | 99 | c | 4
4 | 99 | d | 4
5 | 90 | e | 3
6 | 99 | c | 4
第一个(不太重要的)问题是:
是否可以按id排序密集的_等级:
id|zone|name|dense_rank
-----------------------
1 | 34 | a | 1
2 | 14 | b | 2
3 | 99 | c | 3
4 | 99 | d | 3
5 | 90 | e | 4
6 | 99 | c | 3
但我的最终目标是在字段“区域”更改时更改数据分区。我需要一张这样的桌子:
id|zone|name|window-function?
-----------------------
1 | 34 | a | 1
2 | 14 | b | 2
3 | 99 | c | 3
4 | 99 | d | 3
5 | 90 | e | 4
6 | 99 | c | 5
有什么想法吗
非常感谢查询“最终目标”是:
对于“不太重要”的问题,查询是
SELECT z.*, p.dense_rank
FROM z
JOIN (
SELECT ZONE, row_number() over (order by ID ) as dense_rank
FROM (
SELECT zone, min ( id ) as id
FROM z
GROUP BY zone
) o
) p ON z.zone = p.zone
ORDER BY id
你是怎么做到这一点的?比如,用英语。它似乎是按
id
排序的,但是99得到了3
,但只针对id3
和4
。你能解释一下你对这些排名吗?
SELECT *,
SUM( x ) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
FROM (
SELECT *,
CASE WHEN zone = lag( zone ) over ( order by id )
THEN 0 ELSE 1 END As x
FROM Z
) x
SELECT z.*, p.dense_rank
FROM z
JOIN (
SELECT ZONE, row_number() over (order by ID ) as dense_rank
FROM (
SELECT zone, min ( id ) as id
FROM z
GROUP BY zone
) o
) p ON z.zone = p.zone
ORDER BY id