查看: 540|回复: 5

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

[复制链接]
论坛徽章:
527
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 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
)
)


论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2018-3-10 21:07 | 显示全部楼层
现在能看到原帖

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期: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-10 15:01:39
发表于 2018-3-11 11:15 | 显示全部楼层
貌似论坛审核有点问题, 我那个帖子自己也回复了,也看不到

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期: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-10 15:01:39
发表于 2018-3-11 11:18 | 显示全部楼层
大神2个方法都让人眼前一亮啊

使用道具 举报

回复
论坛徽章:
2
紫蜘蛛
日期:2018-08-24 21:46:44玉兔
日期:2018-09-07 22:04:20
发表于 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;

使用道具 举报

回复
论坛徽章:
527
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 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列,比我的设想更好。

使用道具 举报

回复

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

本版积分规则 发表回复

【有奖讨论】解决存储挑战了解一下
奖品:米家车载空气净化器 、米家声波电动牙刷 、小米运动蓝牙耳机

在数字经济时代,井喷式增长的数据,在释放大量商业价值的同时,也随之对企业的IT基础设施带来了不容忽视的挑战!如何存储、管理、使用这些数据呢?这是一条比以往更艰难的路~

活动时间:9月20日-10月11日

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