特殊SQL的写法

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
如果表的数据是这样的
43728
43729
43730
43731
43732
43733
43734
43735
43736
43737
43738
43739
43740
43741
43742
43743
43744
43745
我想得到这样的结果,请问SQL如何写呢?谢谢
4372843729
4372943730
4373043731
4373143732
4373243733
4373343734
4373443735
4373543736
4373643737
4373743738
4373843739
4373943740
4374043741
4374143742
4374243743
4374343744
4374443745

回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
分析函数,lead或者lag,最后再去掉不需要的首行或者尾行就行了
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
lastwinner 发表于 2012-4-21 13:37
分析函数,lead或者lag,最后再去掉不需要的首行或者尾行就行了

我在号段选取的文章里有使用lead和lag
号段选取1 2 3
同时在 Oracle层次查询和分析函数在号段选取中的应用 有介绍如何使用lead和lag http://www.itpub.net/thread-719692-1-1.html

回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
前一列加 +1 啊
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
jimn1982 发表于 2012-4-21 16:15
前一列加 +1 啊

还要去掉最大1行
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
感觉没这么简单,是不是楼主没描述清楚?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
本帖最后由 huofaan 于 2012-4-22 16:34 编辑
同意newkid的看法.
4楼和5楼的方案适用于orablue的测试数据刚好是连续的(见下)。
如果表的数据是这样的
43728
43729
43730
43731
我想得到这样的结果,请问SQL如何写呢?谢谢
4372843729
4372943730
4373043731

我想我们要写出强健和具有普遍性的算法,不管数据是不是连续的,
这对我们开发人员也是有提高的。
我提出一个处理方案:
selectval1fromt1;
43728
43731
43734
43735
SQL输出结果:
4372843731
4373143734
4373443735
具体的业务SQL:
selectt2.val1first_val,t3.val1next_val
from
(selectrownumrn,val1fromt1
whereval1 (selectmax(val1)fromt1)
orderbyval1)t2,
(selectrownumrn,val1fromt1
whereval1 (selectmin(val1)fromt1)
orderbyval1)t3
wheret2.rn=t3.rn
orderbyt2.val1;

算法说明:t2 和t3 表orderbyval1 排序是关键,决定记录对应的rownum ,
然后 使用rownum进行表链接,即wheret2.rn=t3.rn。
今天休息中,没能连oracle进行验证,若算法有错,请大家包涵。

回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
本帖最后由 duronshi 于 2012-4-22 16:41 编辑
first_value
last_value

with tmp as (
select 43728 id from dual union all
select 43729 from dual union all
select 43730 from dual union all
select 43731 from dual union all
select 43732 from dual union all
select 43733 from dual union all
select 43734 from dual union all
select 43735 from dual union all
select 43736 from dual union all
select 43737 from dual union all
select 43738 from dual union all
select 43739 from dual union all
select 43740 from dual union all
select 43741 from dual union all
select 43742 from dual union all
select 43743 from dual union all
select 43744 from dual union all
select 43745 from dual
)
selectfirst_value(id) over(partition by id order by id rows between 1 preceding and 1 following ) fist_ve,
last_value(id) over( order by id rows between 1 preceding and 1 following ) last_ve
from tmp
order by fist_ve


回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
本帖最后由 duronshi 于 2012-4-22 16:43 编辑
用分析函数first_value,last_value Over()直接搞定
和是否连续没有任何关系

回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
newkid 发表于 2012-4-22 06:09
感觉没这么简单,是不是楼主没描述清楚?

不一定,也许楼主以前没见过lead、lag或者对sql不熟悉,所以觉得是个特殊的sql
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行