【问题标题】:SQL query with unique incrementing id for each group of rows (Postgresql)每组行具有唯一递增 id 的 SQL 查询(Postgresql)
【发布时间】:2021-06-02 21:41:48
【问题描述】:

我有一个表student,其标识列name 类型为TEXT。我正在寻找一个查询,该查询确定性地为每组唯一名称输出一个递增的 id。例如:

------+----------
 name | group_id
------+----------
  A   |    1
  A   |    1
  B   |    2
  C   |    3
  D   |    4
  D   |    4
  D   |    4

我查看了 PSQL(当前运行 PostgreSQL 13.2)中的窗口函数,但没有运气。感觉做起来很简单,但就是想不通。

【问题讨论】:

  • 看起来像 ROW_NUMBER()OVER(PARTITION BY NAME ORDER BY NAME DESC)AS GROUP_ID
  • 不幸的是,ROW_NUMBER() 函数为每个分区的第一行分配一个,并为同一分区中的每一行增加一个。我正在寻找的是为第一个分区中的每一行分配一个,然后为每个分区增加一个。

标签: sql postgresql


【解决方案1】:

demo:db<>fiddle

这正是dense_rank() window function 所做的。

SELECT
    *,
    dense_rank() OVER (ORDER BY name) as group_id
FROM t

【讨论】:

  • 啊,谢谢!我缺少的关键是您只在列上使用 ORDER BY,而不是 PARTITION BY。我还不完全明白为什么,但至少我知道我在看什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多