2

这是我的输入数据:

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_values1-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

有更好的窗口功能吗?

4

1 回答 1

2
with 
  t(x,y) as (values
    (1, 12),
    (2, 7),
    (3, 8),
    (4, 8),
    (5, 7)),
  pos(i,y) as (select min(x), y from t group by y),
  ind(i,y) as (select row_number() over(order by i), y from pos)
select * from ind join t using(y) order by x;
于 2016-12-02T22:06:41.707 回答