postgresql - 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
我已经尝试过分区的 row_number 。但这会导致另一种枚举。
谢谢你的帮助
解决方案
对于这种情况,您可以使用rank()
or dense_rank()
:
SELECT
*,
dense_rank() OVER (ORDER BY value)
FROM
mytable
rank()
为组的每个元素生成一个有序数字,但它会产生间隙(如果第一组中有 3 个元素,则从第 4 行开始的第二组将获得数字 4)。dense_rank()
避免了这些差距。
请注意,这会value
按字母顺序按列对表格进行排序。因此,结果将是: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
推荐阅读
- spring - 基于spring集成实现drda服务器或单独处理链式输入消息和链式输出
- mysql - 如何在 mysql 的制表中的不同行中写入多个总计?
- amazon-web-services - AWS::ApiGateway::Resource 的 AWS Cloudformation 模板:如何为 RequestParameter 创建动态密钥?
- python - 使用 python 2.7 在 Windows 10 上安装 pip
- c# - ASP.Net Core UWP SignalR 客户端 HubConnectionBuilder.Build 崩溃
- javascript - 如何在没有 Flash 的情况下从 WEB 发布 mediaStream 到 mediaServer
- ios - 我们如何把上面的文字放在上面?UIL标签
- metrics - 列出 Report Suite Adobe Analytics 的所有维度和指标
- java - 如何在单击列表中选择的歌曲然后播放歌曲时将活动更改为现在播放类型
- optaplanner - 访问约束流内计划集合的值范围