sql - 如何在 PostgreSQL 中给每个组编号

标签 sql postgresql

我将如何使用窗口函数或类似函数,根据某些共享特征对每组或行分区进行编号?

例如:

我有一个按字母顺序排列的名称列表,我希望使用描述他们所属的组和在每个组中的位置的 ID 对其进行分组和识别。

-------------------------------------------
| outer_id | inner_id | src_id |   name   |
|----------|----------|--------|----------|
|     1    |     1    |  88129 | albert   |
|     1    |     2    |  88130 | albrecht |
|     1    |     3    |  88131 | allan    |
|     2    |     1    |  88132 | barnaby  |
|     2    |     2    |  88133 | barry    |
|     2    |     3    |  88134 | bart     |
-------------------------------------------

我可以使用类似于以下的查询来获取 inner_idsrc_idname:

WITH cte (src_id, name) AS (

    VALUES

    (88129, 'albert'),
    (88130, 'albrecht'),
    (88131, 'allan'),
    (88132, 'barnaby'),
    (88133, 'barry'),
    (88134, 'bart')

)

SELECT row_number() OVER (partition by left(name, 1) ORDER BY name DESC) AS inner_id, src_id, name
FROM cte;

我将如何添加一个 outer_id 列来表示每个窗口(或组)?

最佳答案

你可以使用dense_rank():

select dense_rank() over (order by left(name, 1)) as outer_id,
       row_number() over (partition by left(name, 1) order by name desc) as inner_id,
       src_id, name
from cte;

关于sql - 如何在 PostgreSQL 中给每个组编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45147563/

相关文章:

postgresql - 是否有任何方法可以在 Windows 64 位上的 Postgresql 9.3 64 位或 32 位中成功安装 PLPython?

mysql - 使用条件 If 语句查询

sql - 我应该把 .mdf 和 .ldf 文件放在哪里才能通过 git 共享 SQL 脚本

MYSQL 连接查询建议(删除孤立行)

mysql - Left Outer Join 不返回我左表中的所有行?

SQL:从多个表中查找最长的日期间隔

sql - 将多维数组转换为记录

创建函数时在创建时或接近创建时出现 postgresql 语法错误

postgresql - now() 默认值都显示相同的时间戳

sql - 什么是全文搜索与 LIKE