POSTGRESQL:如果具有相同的条件,则枚举相同的数字

问题描述 投票:0回答:1

我有什么

id | value
1 | foo
2 | foo
3 | bah
4 | bah
5 | bah
6 | jezz
7 | jezz
8 | jezz
9 | pas
10 | log

我需要:像下面的例子一样枚举行

id | value | enumeration
1 | foo | 1
2 | foo | 1
3 | bah | 2
4 | bah | 2
5 | bah | 2
6 | jezz | 3
7 | jezz | 3
8 | jezz | 3
9 | pas | 4
10 | log | 5

我已经尝试将row_number与过度分区。但这导致了另一种枚举。

感谢您的帮助

postgresql partition row-number enumerate
1个回答
0
投票

在这种情况下,您可以使用rank()dense_rank()

Click: demo:db<>fiddle

SELECT
    *,
    dense_rank() OVER (ORDER BY value)
FROM
    mytable

rank()会为组中的每个元素生成一个有序编号,但会产生间隔(如果第一组中有3个元素,则第二组从第4行开始将得到数字4)。 dense_rank()避免了这些间隙。

注意,这按value列的字母顺序对表进行排序。因此,结果将是:blah == 1foo == 2jezz == 3log == 4pas == 5


如果要保留订单,则需要附加的订单条件。在您的情况下,如果没有其他可用的列,则可以使用id列创建这样的列:

Click: demo:db<>fiddle

首先,使用first_value()查找每个值组的最低id

SELECT
    *,
    first_value(id) OVER (PARTITION BY value ORDER BY id)
FROM
    mytable

[计算foo == 1时,此第一个值(blah == 3dense_rank(),...)可用于保持原始顺序:

SELECT
    id,
    value,
    dense_rank() OVER (ORDER BY first_value)
FROM (
    SELECT
       *,
       first_value(id) OVER (PARTITION BY value ORDER BY id)
    FROM
       mytable
) s
© www.soinside.com 2019 - 2024. All rights reserved.