在特定条件下使用 LAG 函数
Posted
技术标签:
【中文标题】在特定条件下使用 LAG 函数【英文标题】:Using LAG function with a specific condition 【发布时间】:2020-04-22 09:29:56 【问题描述】:我有一个以下格式的表格。
我可以使用 oracle SQL 中的 LAG 函数将表格转换为以下格式。
但是,我希望以这样一种方式创建此结果表,即对于状态为“ON”的行,to_date 应提供下一个“OFF”日期的日期。下面是它的样子。
我们如何在 Oracle SQL 中做到这一点?
【问题讨论】:
【参考方案1】:我认为您想要一个带有选项ignore nulls
的条件lead()
:
select
id,
date from_date,
case when status = 'ON'
then lead(case when status = 'OFF' then date end ignore nulls)
over(partition by id order by date)
end to_date,
status
from mytable
为了更好地匹配预期结果,我们将函数应用于'OFF'
以外的任何状态,并从结果中撤回1天:
select
id,
date from_date,
case when status <> 'OFF'
then lead(case when status = 'OFF' then date end ignore nulls)
over(partition by id order by date) - 1
end to_date,
status
from mytable
如果您还想要'OFF'
行的下一个'ON'
日期:
select
id,
date from_date,
case when status <> 'OFF'
then lead(case when status = 'OFF' then date end ignore nulls)
over(partition by id order by date) - 1
else lead(case when status = 'ON' then date end ignore nulls)
over(partition by id order by date) - 1
end to_date,
status
from mytable
Demo on DB Fiddlde
第一个查询:
身份证 | FROM_DATE | TO_DATE |地位 ----: | :-------- | :-------- | :----- 15643 | 20 年 3 月 10 日 | 20 年 3 月 20 日 |在 15643 | 20 年 3 月 15 日 | 空 |测试 15643 | 20 年 3 月 20 日 | 空 |离开第二次查询:
身份证 | FROM_DATE | TO_DATE |地位 ----: | :-------- | :-------- | :----- 15643 | 20 年 3 月 10 日 | 20 年 3 月 19 日 |在 15643 | 20 年 3 月 15 日 | 20 年 3 月 19 日 |测试 15643 | 20 年 3 月 20 日 | 空 |离开第三个查询(您看不到与第二个查询的区别,因为没有'OFF'
行和下一个'ON'
):
【讨论】:
以上是关于在特定条件下使用 LAG 函数的主要内容,如果未能解决你的问题,请参考以下文章