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中的行号-保持相同以更改值的主要内容,如果未能解决你的问题,请参考以下文章
TSQL在同一列A上放置相同的等级/行号,但一旦A列更改就会增加
将行号列添加到绑定到 DataTable 的 DataGridView