POSTGRESQL:如果具有相同的条件,则用相同的数字枚举
POSTGRESQL: Enumerate with the same number if having the same criteria
我有什么
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 分区过多。但这会导致另一种枚举。
感谢您的帮助
对于这种情况,您可以使用 rank()
或 dense_rank()
:
SELECT
*,
dense_rank() OVER (ORDER BY value)
FROM
mytable
rank()
为组中的每个元素生成一个有序数字,但它会产生间隙(如果第一组中有 3 个元素,则从第 4 行开始的第二组将获得数字 4)。 dense_rank()
避免了这些差距。
请注意,这会按 value
列的字母顺序对 table 进行排序。因此,结果将是:blah == 1
、foo == 2
、jezz == 3
、log == 4
、pas == 5
.
如果您想保留您的订单,您需要一个额外的订单标准。在您的情况下,您可以使用 id
列来创建这样一个列,如果没有其他列可用:
首先,使用 first_value()
找到每个值组的最低 id
:
SELECT
*,
first_value(id) OVER (PARTITION BY value ORDER BY id)
FROM
mytable
这个第一个值(foo == 1
、blah == 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
我有什么
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 分区过多。但这会导致另一种枚举。
感谢您的帮助
对于这种情况,您可以使用 rank()
或 dense_rank()
:
SELECT
*,
dense_rank() OVER (ORDER BY value)
FROM
mytable
rank()
为组中的每个元素生成一个有序数字,但它会产生间隙(如果第一组中有 3 个元素,则从第 4 行开始的第二组将获得数字 4)。 dense_rank()
避免了这些差距。
请注意,这会按 value
列的字母顺序对 table 进行排序。因此,结果将是:blah == 1
、foo == 2
、jezz == 3
、log == 4
、pas == 5
.
如果您想保留您的订单,您需要一个额外的订单标准。在您的情况下,您可以使用 id
列来创建这样一个列,如果没有其他列可用:
首先,使用 first_value()
找到每个值组的最低 id
:
SELECT
*,
first_value(id) OVER (PARTITION BY value ORDER BY id)
FROM
mytable
这个第一个值(foo == 1
、blah == 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