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