ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 506|回复: 5

"Oracle 10g的环境怎么获取当前行前2个不为空的值"帖子不见啦?

[复制链接]
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 2018-3-9 23:33 | 显示全部楼层 |阅读模式

原贴地址:
http://www.itpub.net/thread-2100281-1-1.html

楼主问的是这个SQL在10G要如何实现:
WITH TMP AS
(SELECT LEVEL AS ID, CASE WHEN LEVEL IN (3,4,5,7) THEN NULL ELSE LEVEL END  AS VALUE
  FROM   DUAL
  CONNECT BY LEVEL <= 10)
SELECT T.*, LAG(VALUE IGNORE NULLS, 1) OVER(ORDER BY ID) AS L1,
       LAG(VALUE IGNORE NULLS, 2) OVER(ORDER BY ID) AS L2
FROM   TMP T;

我提供了一个方法:
WITH TMP AS
(SELECT LEVEL AS ID, CASE WHEN LEVEL IN (3,4,5,7) THEN NULL ELSE LEVEL END  AS VALUE
  FROM   DUAL
  CONNECT BY LEVEL <= 10)
select id
      ,last_value(value ignore nulls) over(order by id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) l1
      ,regexp_substr(wmsys.wm_concat(value) over(order by id desc ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING),'[^,]+',1,2) l2
      from tmp
order by id;


又想出第二个,结果帖子就不见了:
WITH TMP AS
(SELECT LEVEL AS ID, CASE WHEN LEVEL IN (3,4,5,7) THEN NULL ELSE LEVEL END  AS VALUE
  FROM   DUAL
  CONNECT BY LEVEL <= 10)
select id,l1
      ,last_value(l3 ignore nulls) over(order by id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) l2
  from (
select id,l1,nvl2(value,l1,null) l3
  from (
select id
      ,value
      ,last_value(value ignore nulls) over(order by id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) l1
from tmp
)
)


论坛徽章:
399
优秀写手
日期:2013-12-18 09:29:08itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2018-3-10 21:07 | 显示全部楼层
现在能看到原帖

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
17
秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-09 16:42:50慢羊羊
日期:2015-06-15 21:49:18
发表于 2018-3-11 11:15 | 显示全部楼层
貌似论坛审核有点问题, 我那个帖子自己也回复了,也看不到

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
17
秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-09 16:42:50慢羊羊
日期:2015-06-15 21:49:18
发表于 2018-3-11 11:18 | 显示全部楼层
大神2个方法都让人眼前一亮啊

使用道具 举报

回复
论坛徽章:
0
发表于 2018-3-12 15:54 | 显示全部楼层
按大神的sql稍作修改扩展到了求前n个不为空的值
with tab as (
select level as id, case when level in (3,4,5,7) then null else level end  as value
  from   dual
connect by level <= 10)
select *
  from (select t1.*,
               first_value(t1.value ignore nulls) over(order by t1.id rows between 0 preceding and unbounded following) fv
          from tab t1) t1,
       (select t2.id,
               lag(t2.value, 1) over(order by t2.id) l1,
               lag(t2.value, 2) over(order by t2.id) l2,
               lag(t2.value, 3) over(order by t2.id) l3,
               lag(t2.value, 4) over(order by t2.id) l4
          from tab t2
         where t2.value is not null) t2
where t1.fv = t2.id
order by t1.id;

使用道具 举报

回复
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
 楼主| 发表于 2018-3-13 03:43 | 显示全部楼层
nayi224 发表于 2018-3-12 15:54
按大神的sql稍作修改扩展到了求前n个不为空的值
with tab as (
select level as id, case when level in  ...

你这个方法我也想到过,当时想的是用ID做 LEFT JOIN连回去。你搞出的这个FV列,比我的设想更好。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表