sql中的行号-保持相同以更改值

Posted

技术标签:

【中文标题】sql中的行号-保持相同以更改值【英文标题】:row number in sql -keep it same for change in value 【发布时间】:2020-12-21 20:13:23 【问题描述】:

我有一个 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

我正在寻找基于前三列填充第四列的最佳方法。

【问题讨论】:

请用文字描述你想要的逻辑。从您的数据中看不出来。 除了说明逻辑,请提供数据库标签。 【参考方案1】:

你没有很好地解释逻辑。但是您似乎不想计算下一行的“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 是一个 dbfiddle。

【讨论】:

【参考方案2】:

我认为您只想在当前行的值与前一行的值相同时才增加计数器。您可以使用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
)

【讨论】:

以上是关于sql中的行号-保持相同以更改值的主要内容,如果未能解决你的问题,请参考以下文章

当Oracle中的字段值更改时增加行号

TSQL在同一列A上放置相同的等级/行号,但一旦A列更改就会增加

将行号列添加到绑定到 DataTable 的 DataGridView

查找特定列中的最小值和矩阵中相应的行号

Java:Eclipse 中的行号与命令行中的行号相同吗? [关闭]

生成行号并将相同的行号分配给相同的值