【问题标题】:Data partition in Postgresql using Window-Functions使用 Window-Functions 在 Postgresql 中进行数据分区
【发布时间】:2016-06-06 16:28:06
【问题描述】:

我有表'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

返回:

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 排序dense_rank:

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

有什么想法吗?

非常感谢

【问题讨论】:

  • 你是怎么做到这一点的?比如说英文。它似乎按id 排序/排名,但随后99 得到3 但仅适用于id 34。你能解释一下你对这些进行排名吗?

标签: postgresql window-functions


【解决方案1】:

“最终目标”的查询是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    相关资源
    最近更新 更多