年轻时
自我介绍
切换风格
订阅我的Blog
博客日历
文章归档...
最新发表...
博客统计...
网站链接...
资源
===========================================================
如何用标准SQL实现 row_number()函数功能
===========================================================

今天一朋友突然Q上问我这个问题,如何用标准SQL实现row_number()函数那样的功能,比较特殊的问题。废了点脑子,想到如下解决办法:

建立一张测试表TEST:

create table test(id number,a varchar2(10));

插入三条数据:

1,A;

1,B;

2,C。

要实现出row_number()over(order by a partition by id)的功能,用以下SQL实现:

select a1.*,(select count(*) from test a2 where a1.id=a2.id and a2.a<=a1.a) as rownumber from test a1

查询结果如下:

1,A,1;

1,B,2;

2,C,1。

解决了,不过还有点小问题,你看出来了吗?



darmee 发表于:2012.01.06 11:34 ::分类: ( 玩悟技术 ) ::阅读:(112次) :: 评论 (0) :: 引用 (0)
===========================================================
【原创】再谈谈行转列
===========================================================

今天碰到了个需求需要将数据表中数据行转列显示,也就是要将多行的数据放到同一列中。自己前几年也写过类似的文章,感觉行转列这种类似的问题及需求一直存在呀,连oracle在11g中都专门新加了个函数,专门用来处理这类需求。

言归正传,先看看上面提到的oracle11g中的这个函数:listagg,在11g系统下实验了下,确实比较给力。

代码内容:
with c as(
select 1 id,'a' name from dual union
select 2,'b' from dual union
select 2,'c' from dual)
select id,listagg(name,',')within group(order by name) names from c group by id

除了可以处理正常的行转列需求外,还可以按照特定顺序排列显示,确实比较BT,果然新版本还是有好处的。

下面说说10g的,刚刚动了下脑子写出来的,用到生成树相关的函数,代码内容:
with c as(
select 1 id,'a' name from dual union
select 2,'b' from dual union
select 2,'c' from dual)
select id,substr(sys_connect_by_path(t.name,','),2) names from
(select c.*,row_number()over(partition by id order by name) rm from c) t
where connect_by_isleaf=1
start with t.rm = 1 connect by prior t.rm+1 = t.rm and prior t.id = t.id

细节一是用到row_number函数用来生成伪列,其中也可以利用到row_number函数实现listagg中相同的order by功能,二是在生成树的规则时用到prior t.rm+1 = t.rm and prior t.id = t.id这两个条件,三是利用connect_by_isleaf函数只显示叶子那一条记录。

9i的话与10g差别不大,主要是9i中不提供connect_by_isleaf函数,这点比较悲催,换个方式解决下:


with c as(
select 1 id,'a' name from dual union
select 2,'b' from dual union
select 2,'c' from dual)
select id,max(substr(sys_connect_by_path(t.name,','),2)) names from
(select c.*,row_number()over(partition by id order by name) rm from c) t
start with t.rm = 1 connect by prior t.rm+1 = t.rm and prior t.id = t.id
group by id

区别在哪里,自己看

因为目前的环境是采用9i的库,所以只好用最后一种方法,还是新版本比较有乐趣啊



darmee 发表于:2011.03.31 10:15 ::分类: ( 玩悟技术 ) ::阅读:(16611次) :: 评论 (0) :: 引用 (0)
===========================================================
温州雁荡山
===========================================================
好久没在这里留言了,简短的记录下。 2010年4月,整月都是呆在这个深山老林中,环境幽雅,只是不是来专门度假的。
darmee 发表于:2010.04.10 10:40 ::分类: ( Darmee‘s story ) ::阅读:(41382次) :: 评论 (0) :: 引用 (0)
===========================================================
记录sysbase碰到的一个小问题
===========================================================

sysbase客户端使用类似SELECT XXX INTO TEMPTABLE FROM TABLEA语句时很正常,但在java程序用jdbc连接后使用同样的语句报错:com.sybase.jdbc3.jdbc.SybSQLException: The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'tempdb' database.

经查资料,只要用具有sa权限的用户登入,在master数据库下执行下列语句即可:

sp_dboption tempdb, 'ddl in tran', true

sp_dboption tempdb, 'allow nulls by default', true

字面上看应该就是修改下db的属性,生效后,java程序执行正常。


darmee 发表于:2009.12.21 19:11 ::分类: ( 玩悟技术 ) ::阅读:(388次) :: 评论 (0) :: 引用 (0)
===========================================================
【原创】 谈谈数据仓库(一)
===========================================================

这个时间,脑子很清醒,带着耳塞听着歌,突然想总结下,小谈下数据仓库。有疏漏或错误的地方还请朋友及时指出来。

今天之前的同事突然联系我,谈起现在的工作,谈到数据仓库,我又想起我以前的工作,虽然我目前暂时没有和数据仓库打交道。但是之前在厦门曾与建行一起搭建信贷数据仓库,之后在阿里软件也基本是我负责那边的数据仓库,所以对这玩意多少还是有点感情的。毕竟有人说自己学习的技术就好比自己的孩子,总会有一种特殊的情感。

对于圈子之外的人,对数据仓库这份工作总觉得有些神秘,但如果踏入了这个领域,可能更多的人会说句:哦,原来就是做报表啊。对此,真的是这样吗?

好了,步入正题。我对数据仓库的第一印象是,凡是数据仓库项目,必定是又臭又长的,而且很有可能投入和产出比严重失调。所以总会是领导很生气,后果很严重。为什么数据仓库项目都是这么久呢,像我最早在厦门时接触的信贷数据仓库从07年到现在还没结束,在阿里软件时计划是做3-5年之久,但才刚刚有点起步阿里软件就夭折了。为什么呢,为什么数据仓库这么吃力不讨好呢?从概念上说不是很简单吗?不就是抽取,清洗,装载吗?

我个人觉得主要有两点导致数据仓库不好弄,一是源数据过于复杂和混乱,二是数据仓库需求不明确。而这两点导致数据仓库涉及面特别广,也就是说关联到的部门最多,只要是其他部门的人稍微不合作,数据仓库人员往往很无奈。

那要如何才能保证数据仓库按照正常的轨道运行呢,从管理角度上讲:领导必须是一个强势的领导,或者是一个接触面广的领导,这样才能保证其他部门发难的几率降低。从技术讲:我觉得一是元数据管理非常重要,将不同源系统的元数据做到准确整理,二是数据仓库的大体需求一定要清楚和明确,千万不能后期被需求部门牵着鼻子走,所以要保证数据仓库中必须要有几个人对业务相当精通。但是从我接触到数据仓库项目和看到别人的数据仓库项目中,这两点往往是被人忽视的。大家都是眼睛一闭,两耳不闻窗外事,凭运气胡乱搞一通,完全是一个押宝行为。

最后谈一个现象,数据仓库技术人员总会纳闷业务人员怎么老是想出各种各样的需求,并不去思考各个需求背后的联系,以及以后可能会衍生出来的新需求,而往往是摆着一副臭脸对着业务人员,而业务人员每次提需求总碰到闭门羹或一副副臭脸,心里肯定有想法,于是碍于人情或其他因素,会慢慢的减少需求,但一旦项目上线后,问题一下子暴露出来了,业务部门开始在背后骂怎么又出了一个烂系统。不欢而散。由此可见技术人员做事情很需要耐心和责任心,数据仓库项目更甚,其实我始终觉得it人员其实就是一高级客服罢了,放低姿态,总会海阔天空。

未完待续。


darmee 发表于:2009.12.16 20:33 ::分类: ( 玩悟技术 ) ::阅读:(672次) :: 评论 (0) :: 引用 (0)
===========================================================
感冒
===========================================================

本来好了,但无奈工作的地方空气实在太差,而且想不通为什么有人感冒了也不回去休息,导致我今天鼻涕流了一天。当然也没啥心思干活。附上一首自己写得打油诗:感冒记。

数十民工集一处,小小感冒来侵袭。

此起彼伏咳不停,强作硬撑不误工。


darmee 发表于:2009.12.02 19:45 ::分类: ( Darmee‘s story ) ::阅读:(47587次) :: 评论 (1) :: 引用 (0)
===========================================================
近半年+未来
===========================================================

11月底,有公务员国考,当然我没报名。

不知怎的,又想起了想早点离开这里。当然最近确实有尝试过两次,一次是厦门某家担保公司,写了封自我感觉很诚意的邮件,结果是没戏,看来真的是要跳出it行业挺难,就算你抱有一切重来的决心,也很难拿到机会。第二次是小胖给我说的,也是艰难的等待,厦门商业银行招人,而且听说科技部老总是我以前公司的头,但是从10月份以来等到现在……

为什么我想回厦门呢,古时候的人做事讲究天时地利人和,我想在厦门至少占了地利和人和两项。

中午睡了一觉之后,继续。

关于未来,我今天又想起了曾经自己想过的,就是将来做一份跟培训相关的工作。我也明白了我对培训确实有些兴趣和自己的见解,如果真的有这样的打算,自己是否要好好考虑一下,该如何规划才能走向这条路上。

最近翻了下菜根谭,是本不错的书。


darmee 发表于:2009.11.23 14:21 ::分类: ( Darmee‘s story ) ::阅读:(320次) :: 评论 (1) :: 引用 (0)
===========================================================
分析表,分析列,分析分析分析
===========================================================

好像Oracle是8i后开始推CBO,9i就默认是CBO了,当然如果要让表走CBO,就先要分析分析分析表了。如果没有表的统计信息话,就自动走RBO了。

分析表语句如下:

analyze table name compute statistics,当然这是最简单的一种写法,详细写法上网查吧。

只要对表分析了之后,下次访问表时就是走CBO了。

当然在这里还没完,分析列分析列分析列,为什么要这么怨念的打上这么多,是因为有时光分析表还是不够的。

比如表test上的a字段,100w条记录,99w是0,1w是1,这个时候如果只做表分析的话,访问test,条件where a=xxx时,不管xxx是0还是1,统统都是走索引扫描。

问题来了,显而易见,当where a = 0时,全表扫描肯定效率更高。

所以,这时就分析列分析列吧,具体语句上网搜。

最后,补充下,上一篇提到了rowid,在index中存的就有rowid信息,所以为什么delete大量数据后要重新build,恩,上面那句话是我猜的。


darmee 发表于:2009.11.16 16:50 ::分类: ( 玩悟技术 ) ::阅读:(272次) :: 评论 (0) :: 引用 (0)
===========================================================
写着玩 Oracle rowid
===========================================================

rowid也算是Oracle特有的一个东西,既然存在,肯定有存在的道理。rowid其实是对该row对应的物理地址的一个描述。就像tom说过:A rowid is assigned to a row upon insert and is imutable (never changing) unless the row is deleted and re-inserted (meaning it is another row, not the same row!)

既然rowid是对物理地址的一个描述,那么就选取一个rowid来拆分下具体含义。比如我从表中select出来的一个rowid: AAAM98AAEAAAAG0AAA

在这里,第一位到第六位AAAM98是指数据对象号。

第七位到第十位AAE是指相对文件号。

第十位到第十六位AAAAG0是指数据块号。

最后三位也就是快内的行号。另外,从网上找到一些跟rowid相关的系统函数。

---------------------------------------------------------

function rowid_block_number returns number ( row_id in rowid , ts_type_in in varchar2 default );

---------------------------------------------------------

function rowid_create returns rowid ( rowid_type in number , object_number in number , relative_fno in number , block_number in number , row_number in number );

---------------------------------------------------------

procedure rowid_info ( rowid_in in rowid , rowid_type out number , object_number out number , relative_fno out number , block_number out number , row_number out number , ts_type_in in varchar2 default );

---------------------------------------------------------

function rowid_object returns number ( row_id in rowid );

---------------------------------------------------------

function rowid_relative_fno returns number ( row_id in rowid , ts_type_in in varchar2 default );

---------------------------------------------------------

function rowid_row_number returns number ( row_id in rowid );

---------------------------------------------------------

function rowid_to_absolute_fno returns number ( row_id in rowid , schema_name in varchar2 , object_name in varchar2 );

---------------------------------------------------------

function rowid_to_extended returns rowid ( old_rowid in rowid , schema_name in varchar2 , object_name in varchar2 , conversion_type in number(38) );

---------------------------------------------------------

function rowid_to_restricted returns rowid ( old_rowid in rowid , conversion_type in number(38) );

---------------------------------------------------------

function rowid_type returns number ( row_id in rowid );

---------------------------------------------------------

function rowid_verify returns number ( rowid_in in rowid , schema_name in varchar2 , object_name in varchar2 , conversion_type in number(38) ); ---------------------------------------------------------

最后,我见过有人利用rowid使查询变得效率更高,具体怎么回事我忘了,真是以废话结尾。


darmee 发表于:2009.11.16 15:22 ::分类: ( 玩悟技术 ) ::阅读:(368次) :: 评论 (0) :: 引用 (0)
===========================================================
start with…connect by 相关
===========================================================

oracle中有这样一种语法,就是start with XX条件,connect by XX,从而将表中的数据以一种树的形式展示出来,由于这一块很容易让人迷糊,总结下。

首先要XX下百度搜索,搜出来的东西基本就是一个鸟样。因为建表语句,插入数据等等准备条件能够搜出一大堆来,这里就不提供,仅提供小结。

1.start with……connect by放在哪?放在where后面就可以了,如果有where的话。本身的connect by和start with先后顺序没有关系。

2.start with 和connect by后面接什么?start with后面接树的顶点,就好比name=老大,想看看后面的各种各样的小弟是谁。connect by当然是树要延伸的条件,好比把老子要看孙子是谁,就看老子下有哪些儿子,再看儿子有哪些儿子。树延伸的条件就是把本儿子名字传入到下一层级的老子名字中。connect by后面有接关键字prior,prior 儿子名字 = 老子名字。就是刚才说的那样把儿子名字传入到下一层级的老子名字中,注意这里prior 也可以写在左边,也可以写在右边,最好每个人形成自己的习惯,免得弄得精神分裂。

3.SYS_CONNECT_BY_PATH函数。SYS_CONNECT_BY_PATH中需要传入两个参数,第一个是字段,第二个是分隔符。好比SYS_CONNECT_BY_PATH(名字,'/'),select出来后的结果就是/老子/儿子/孙子。这里要注意的是调用这个函数时,就是出来的结果都是以分隔符开头的。

4.关键字CONNECT_BY_ROOT,如果select中使用的话,按照这关键字理解就是直接跳回到根节点,比较好使,比如刚才的老子孙子一列,孙子突然忘了老奶叫什么,好办,直接select CONNECT_BY_ROOT 老婆名字 就可以查出来了。道理就是先跳回到根节点,然后查询字段“老婆名字”。

5.关键字CONNECT_BY_ISLEAF 。按字面意思很好理解,就是看看该节点是不是叶子节点,也就是看看这家伙还有没有儿子,没有就返回1(true),有就返回0(false).使用就是直接select CONNECT_BY_ISLEAF就可以了。

最后,关于在oracle使用树形查询还有其他情况,但应该很好触类旁通,就懒得写了。要理解透这些东西还是要多写,要多想,更要会用。比如可以结合其他函数就可以做出很多花样来,这里就不多阐述了。


darmee 发表于:2009.10.23 19:58 ::分类: ( 玩悟技术 ) ::阅读:(1176次) :: 评论 (0) :: 引用 (0)
===========================================================
突然想到的
===========================================================

现在电子商务这么火, B2C,C2C,好像大家都想来瓜分点。竞争肯定很激烈。但是刚刚突然想到的,以后大家的网购选择越来越多,但所有人买东西都喜欢这个原则,物美价廉。看得出来物美还是更重要些,大家网购肯定也想网购到好的产品。如果有某个平台可以做出这种担保,用户从他这里链接出去买到的淘宝,京东,卓越,当当的东西出现不满意的话,可以无条件赔偿用户的损失。商业模式也很简单,一方面收取各个C2C,B2C的宣传费,另一方面也可以收取最终用户的会员费。

然后又无意中看到访问博客的也有十几万的,看来搜索引擎也帮了不少忙。觉得自己偶尔真应该多写点技术文章,一是不知不觉中给自己做了总结,二是有可能对别人做了抛砖引玉的作用。

说起来最近一段时间没总结自己学到的一些东西,还真是惭愧!


darmee 发表于:2009.09.21 15:28 ::分类: ( Darmee‘s story ) ::阅读:(290次) :: 评论 (0) :: 引用 (0)
===========================================================
转战北京
===========================================================

现在的我正坐在新单位的办公室内,从8月1号就正式从杭州来到了北京,拉着两箱行李,一个背包,就这么来到了北京。做的还是老本行,IT民工。

有人说恭喜我事业高升,有人羡慕我,但究竟好与坏,还需要自己接下来几年在北京的工作生活才能慢慢体会。

总之,一切重新开始,这里的日志也将断断续续的写着。希望自己能够过得比以前好。


darmee 发表于:2009.08.25 14:38 ::分类: ( Darmee‘s story ) ::阅读:(50592次) :: 评论 (0) :: 引用 (0)
===========================================================
一个具有投资价值的地方
===========================================================

一个连云港的朋友跟我说,他那边的海边别墅巨便宜,都没人买,我以为他开玩笑,后来一时兴起去连云港的房产网查了下,果然跟其他地方相比低很多。

这座城市,也许几年之后,这块地就不是这钱了。我昨晚还在央视上看到了连云港的广告。

也许,这是一个投资机会!


darmee 发表于:2009.08.21 17:03 ::分类: ( Darmee‘s story ) ::阅读:(310次) :: 评论 (0) :: 引用 (0)
===========================================================
一个具有投资价值的
===========================================================

只是因为同事的一个偶尔提起,让我突然觉得这一块也许真的具有投资价值,只是手头上资金不多。

所以还是写在这里吧,看有没有人有兴趣愿意做,回复下自己的联系方式好了。我没有发在其他地方,省的流言说我是打广告。一切看缘分吧。


darmee 发表于:2009.06.21 13:10 ::分类: ( Darmee‘s story ) ::阅读:(283次) :: 评论 (0) :: 引用 (0)
===========================================================
一连串流水账
===========================================================

昨晚刚从福州回来,杭州跟福州相比,的确晚上会凉些。

嗯,来回都碰到有意思的人,去是旁边坐了个中科院直博女,聊得还算投机。

回来的时候旁边是个lv有钱女。聊得很无趣。两人都很神奇的地方是第六感还算挺强,一个知道我的工作地点,一个看着登机牌上的拼音猜出我的名字怎么写,当然有可能她只知道这两个字。

在杭州的日子过得很快,就像四月一眨眼间又没有了,可能是因为每天都是简单的重复,现在叫我想想都回忆不出四月到底发生了什么。

无意中看到过这样一句话:驴拉磨,勤劳的拉啊拉,却拉不出明天。好像是这么说的。

五一前公司前台妹离职,又少了个美女。

写了一半被打断了下

马上要季度考核,说要事先准备好如下些问题

本季度的工作状态,心态如何?

本季度取得了哪些进步?

本季度哪些方面做的比较好,哪些方面做的不够好?

接下来的改进计划 对团队的看法和建议

你的小头头需要改进的地方? 其他的任何问题?

忽然看到下面的日志,想起这周又是走南闯北的一周。


darmee 发表于:2009.05.05 19:17 ::分类: ( Darmee‘s story ) ::阅读:(52675次) :: 评论 (0) :: 引用 (0)