sql - Oracle:按条件排序并保留历史记录
问题描述
我有这个示例表:
我需要创建一个排名列,它将根据 is_true=1 对 id 进行排序,这意味着 is_true 从 0 到 1 的每次更改都会将索引增加 1。如下所示:
我试过类似的东西:
select id, customer_id, is_true,
rank() over (partition by customer_id order by (case when is_true=1 then id end)) index_rank
from table
但它没有提供我需要的东西。
任何帮助都感激不尽。
解决方案
你可以做一个窗口总和:
select
t.*,
1 + sum(is_true) over(partition by cutsomer_id order by id) index_rank
from mytable t
如果你想允许连续1
的 s 而不增加排名,那么你可以lag()
先使用:
select
t.*,
1 + sum(case when is_true = 1 and lag_is_true = 0 then 1 else 0 end)
over(partition by cutsomer_id order by id) index_rank
from (
select
t.*,
lag(is_true) over(partition by cutsomer_id order by id) lag_is_true
from mytable t
) t
推荐阅读
- ruby-on-rails - 未定义的方法`add_column_for_on_duplicate_key_update` - activerecord-import
- c++ - boost::spirit::x3 中的通用解析器生成器
- python - 从 python 中重新启动 ipyparall 引擎
- python - 无法使用 Django 连接到 firebird 数据库
- excel - VBA - 删除临时文件中的查询
- javascript - Bootstrap 4更改特定元素的工具提示颜色
- flutter - json.decode 不转换地图
> - firebase - 可以在 arrayUnion 方法中传递 Firestore DocumentReference 吗?
- git - 在 GCM 调用期间任何 git 命令都会挂起
- python - 将 PDT 区域中的时间戳转换为日期时间 - Python