使用 Window-Functions 在 Postgresql 中进行数据分区
Data partition in Postgresql using Window-Functions
我有 table 'Z':
id|zone|name
------------
1 | 34 | a
2 | 14 | b
3 | 99 | c
4 | 99 | d
5 | 90 | e
6 | 99 | c
查询
SELECT *,dense_rank() (OVER ORDER BY zone) FROM Z
return:
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
第一个(不太重要)的问题是:
是否有可能 dense_rank 按 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
但我的最终目标是在 'zone' 字段更改时更改数据分区。我需要这样的 table:
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
有什么想法吗?
非常感谢
"final target" 的查询是:
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
对于 "less important" 问题,查询是
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
我有 table 'Z':
id|zone|name
------------
1 | 34 | a
2 | 14 | b
3 | 99 | c
4 | 99 | d
5 | 90 | e
6 | 99 | c
查询
SELECT *,dense_rank() (OVER ORDER BY zone) FROM Z
return:
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
第一个(不太重要)的问题是: 是否有可能 dense_rank 按 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
但我的最终目标是在 'zone' 字段更改时更改数据分区。我需要这样的 table:
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
有什么想法吗?
非常感谢
"final target" 的查询是:
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
对于 "less important" 问题,查询是
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