Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用窗口函数对Postgresql中的数据进行分区_Postgresql_Window Functions - Fatal编程技术网

使用窗口函数对Postgresql中的数据进行分区

使用窗口函数对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 |

我有桌子“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 |  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
,但只针对id
3
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