sql 中的行号 - 保持不变以改变值

row number in sql -keep it same for change in value

我有一个 SQL 问题:我想将每条记录的排名填充为下一个数字。但是,我想对调整值不同的记录保持相同的排名。

示例数据:

# | value | date1      | * rank (expected)
--+-------+------------+-------
1 | A     | 05/01/2020 |    1
1 | A     | 05/02/2020 |    2
1 | A     | 05/03/2020 |    3
1 | B     | 05/04/2020 |    3
1 | A     | 05/05/2020 |    3
1 | A     | 05/06/2020 |    4
1 | A     | 05/07/2020 |    5
1 | A     | 05/08/2020 |    6
1 | B     | 05/09/2020 |    6
1 | A     | 05/10/2020 |    6
1 | A     | 05/11/2020 |    7

我正在寻找根据前三列填充第 4 列的最佳方法。

我认为您只想在当前行的值与上一行的值相同时才递增计数器。您可以使用 lag() 和累积 sum():

select id, value, date1,
    sum(case when lag_value <> value then 0 else 1 end) as rnk
from (
    select t.*,
        lag(value) over(order by date1) as lag_value
    from mytable t
)

你没有很好地解释逻辑。但是您似乎不想计算下一行的“B”和“A”。

这可以表述为以下等式:

  • 行号减去
  • 该行的 B 数的两倍(也得到下一行)
  • 如果行是 B,则加 1(因为我们刚刚多减了下一行)。

这可以实现为:

select t.*,
       (row_number() over (partition by num order by date1) -
        2 * count(*) filter (where value = 'B') over (order by date1) +
        (value = 'B')::int
       )
from t
order by num, date1;

Here 是一个 db<>fiddle.