我有一个表,需要为其分配编号规则,然后根据另一列中的值再次将编号规则重新启动为 1。
这是我的桌子:
| 日期 | 姓名 | 指标 |
|---|---|---|
| 2022年1月12日 | 测试1 | 1 |
| 2022年2月12日 | 测试2 | 无效的 |
| 2022年3月12日 | 测试3 | 无效的 |
| 2022年4月12日 | 测试4 | 无效的 |
| 2022年5月12日 | 测试5 | 1 |
| 2022年6月12日 | 测试6 | 无效的 |
| 2022年7月12日 | 测试7 | 1 |
| 2022年8月12日 | 测试8 | 无效的 |
我需要的是在末尾添加一个“实例”列,该列只是继续数字序列,直到再次遇到“指示器”列中带有 1 的行,然后重置。
所以我想要的结果是:
| 日期 | 姓名 | 指标 | 实例 |
|---|---|---|---|
| 2022年1月12日 | 测试1 | 1 | 1 |
| 2022年2月12日 | 测试2 | 无效的 | 2 |
| 2022年3月12日 | 测试3 | 无效的 | 3 |
| 2022年4月12日 | 测试4 | 无效的 | 4 |
| 2022年5月12日 | 测试5 | 1 | 1 |
| 2022年6月12日 | 测试6 | 无效的 | 2 |
| 2022年7月12日 | 测试7 | 1 | 1 |
| 2022年8月12日 | 测试8 | 无效的 | 2 |
我试过玩DENSE_RANK() over (Order by Date)
但我明白最终会这样:
| 日期 | 姓名 | 指标 | 实例 |
|---|---|---|---|
| 2022年1月12日 | 测试1 | 1 | 1 |
| 2022年2月12日 | 测试2 | 无效的 | 2 |
| 2022年3月12日 | 测试3 | 无效的 | 3 |
| 2022年4月12日 | 测试4 | 无效的 | 4 |
| 2022年5月12日 | 测试5 | 1 | 1 |
| 2022年6月12日 | 测试6 | 无效的 | 6 |
| 2022年7月12日 | 测试7 | 1 | 1 |
| 2022年8月12日 | 测试8 | 无效的 | 8 |
序列继续,它不会在 1(在指示器列中)处重置。
你可以做:
select x.*, row_number() over(partition by g order by date) as instance
from (select t.*, sum(indicator) over(order by date) as g from t) x
Run Code Online (Sandbox Code Playgroud)
结果:
Date Name Indicator g instance
----------- ------ ---------- -- --------
2022-01-12 Test1 1 1 1
2022-02-12 Test2 null 1 2
2022-03-12 Test3 null 1 3
2022-04-12 Test4 null 1 4
2022-05-12 Test5 1 2 1
2022-06-12 Test6 null 2 2
2022-07-12 Test7 1 3 1
2022-08-12 Test8 null 3 2
Run Code Online (Sandbox Code Playgroud)
请参阅db<>fiddle处的运行示例。
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |