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



我有什么

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

我已经尝试过使用overpartition的row_number。但这导致了另一种列举。

感谢的帮助

对于这种情况,可以使用rank()dense_rank()

单击:demo:db<>小提琴

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

rank()为组中的每个元素生成一个有序的数字,但它会创建间隙(如果第一组中有3个元素,则从第4行开始的第二组将获得数字4(。CCD_ 4避免了这些间隙。

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


如果您想保留订单,您需要一个额外的订单标准。在您的情况下,如果没有其他可用列,您可以使用id列来创建这样的列:

单击:demo:db<>小提琴

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

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

第一个值(foo == 1blah == 3…(可用于在计算dense_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

相关内容

  • 没有找到相关文章

最新更新