lag(v.executive_date, 1, nvl( (select a.fill_date from t_mh_baseinfo a where a.if_del='0' and a.fill_date>=trunc(sysdate-1,'yyyy') and a.field_pk=v.baseinfo_field_pk_fk) , trunc(sysdate-1,'yyyy')) ) over(partition by v.baseinfo_field_pk_fk order by v.executive_date,v.dt_create) last_follow,
时间: 2024-04-11 08:32:03 浏览: 170
这段代码是一个使用了 LAG 函数的窗口函数表达式。让我逐步解释它的含义:
1. 首先,使用了 LAG 函数来获取指定列(v.executive_date)在当前行之前的一行数据。语法为 `LAG(column, offset, default)`,其中 `column` 是要获取的列,`offset` 是指定的偏移量(这里为1,表示前一行),`default` 是当偏移位置不存在时返回的默认值。
2. 如果前一行数据不存在(即 offset 超出了范围),则使用 NVL 函数来确定默认值。NVL 函数用于判断第一个参数是否为 NULL,如果是,则返回第二个参数作为默认值。
3. 在 NVL 函数的第一个参数中,使用了一个子查询来获取满足一些条件的行的 fill_date 值。子查询是从表 t_mh_baseinfo 中选择符合条件的数据,其中包括 if_del='0'、fill_date 大于等于去年年初(trunc(sysdate-1,'yyyy')),以及 field_pk 等于当前行的 baseinfo_field_pk_fk 值。
4. 如果子查询没有返回结果(即满足条件的行不存在),则使用 trunc(sysdate-1,'yyyy') 作为默认值。trunc(sysdate-1,'yyyy') 是将昨天的日期截取到年份的开始,即去年年初。
5. 最后,使用 OVER 子句指定了窗口函数的分区和排序方式。其中,分区按照 baseinfo_field_pk_fk 列进行分组,排序按照 executive_date 和 dt_create 列进行排序。
综上所述,这段代码的作用是在查询结果中添加了一个名为 last_follow 的列,该列包含了在当前行之前的一行数据的 executive_date 值。如果找不到前一行数据,则使用满足条件的 fill_date 值,如果条件也不满足,则使用去年年初的日期作为默认值。
阅读全文