这是我的输入数据:
CREATE TEMP TABLE test AS SELECT * FROM (VALUES
(1, 12),
(2, 7),
(3, 8),
(4, 8),
(5, 7)
) AS rows (position, value);
我想在单个查询(没有子查询或 CTE)中为每个不同的value
. 但是,我也希望这些数字根据关联来提升position
- 即,value
应该根据其最低分配不同的数字position
。
假设:
- 每一行总是有一个唯一的
position
value
不保证每行唯一- 不同值的数量仅用于序数目的,例如
distinct_values
1-2-3 或 3-8-14 无关紧要
所需的输出是:
position | value | distinct_value
----------+-------+----------------
1 | 12 | 1
2 | 7 | 2
3 | 8 | 3
4 | 8 | 3
5 | 7 | 2
我可以使用DENSE_RANK
数字不同的值来接近:
SELECT
position,
value,
DENSE_RANK() OVER (ORDER BY value) AS distinct_value
FROM test ORDER BY position;
结果显然忽略了position
:
position | value | distinct_value
----------+-------+----------------
1 | 12 | 3
2 | 7 | 1
3 | 8 | 2
4 | 8 | 2
5 | 7 | 1
有更好的窗口功能吗?