查看: 2613|回复: 8

[PL/SQL] 问一个涉及partition的sql问题

[复制链接]
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
跳转到指定楼层
1#
发表于 2012-12-11 14:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
首先是表

需要查询的是每个patient的最小diagnosis_no下对应的下面一个表的class名,并且要保证class有值(比如zhang的最小diagnosis_no=k3,可是k3对应的class是空,就需要取k4)
本来是用min partition写
  1. select patiend_id,
  2.        diagnosis_type,
  3.        min(diagnosis_no) over(partition by patiend_id, diagnosis_type) diagnosis_no,
  4.        diagnosis_class
  5.   from (Select patient_id, visit_id, diagnosis_class
  6.           from diagnostic_category a, DIAGNOSIS_DICT b
  7.          where a.diagnosis = b.diagnosis(+)
  8.            and diagnosis_class is not null
  9.            and diagnosis_type = '3')
复制代码

可是xiasen这个patient在最小diagnosis_no=1的情况下没有取对应的class=code,而是三行,难道没有法子对应为一行吗?

如果使用dense_rank() over(partition by patient  order by diagnosis_no)是可以
下面是正确的结果


论坛徽章:
41
紫蛋头
日期:2012-11-12 14:45:312014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-03-03 14:29:41马上有车
日期:2014-03-20 17:48:31马上加薪
日期:2014-03-28 15:18:022014年世界杯参赛球队: 厄瓜多尔
日期:2014-06-25 18:57:33马上有车
日期:2014-07-29 18:27:14马上有车
日期:2014-08-19 14:32:59itpub13周年纪念徽章
日期:2014-10-08 15:16:50
2#
发表于 2012-12-11 14:55 | 只看该作者
你的 diagonosis_code是不是只有4个值?

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
3#
 楼主| 发表于 2012-12-11 14:56 | 只看该作者
jym2002 发表于 2012-12-11 14:55
你的 diagonosis_code是不是只有4个值?

目前是,一个patient有四个或者三个或者两个

使用道具 举报

回复
论坛徽章:
41
紫蛋头
日期:2012-11-12 14:45:312014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-03-03 14:29:41马上有车
日期:2014-03-20 17:48:31马上加薪
日期:2014-03-28 15:18:022014年世界杯参赛球队: 厄瓜多尔
日期:2014-06-25 18:57:33马上有车
日期:2014-07-29 18:27:14马上有车
日期:2014-08-19 14:32:59itpub13周年纪念徽章
日期:2014-10-08 15:16:50
4#
发表于 2012-12-11 15:05 | 只看该作者
isumsen 发表于 2012-12-11 14:56
目前是,一个patient有四个或者三个或者两个

取巧解决下,看看满足你的需求不
select patiend,
       min(diagnosis_no),
       decode(substr(min(diagnosis_no || diagnosis_class), -2),
              'k1',
              'code',
              'k2',
              'pain',
              'k4',
              'headache')
  from diagnostic_category a
where a.diagnosis_code <> k3
group by patient

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
5#
 楼主| 发表于 2012-12-11 16:17 来自手机 | 只看该作者
你这个复杂了,如果我的class很多怎么办

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
6#
发表于 2012-12-11 20:43 来自手机 | 只看该作者
lz, 测试一下如下的代码, 目前我给的代码是已经基于你贴的2表数据, 如果要加其他条件自己改一改即可, 如果结果不对, 把原因详细说明!

代码如下:

select a.patient,
             min(a.diagnosis_no) keep(dense_rank first order by decode(b.diagnosis_class, null, null, a.diagnosis_no) nulls last) diagnosis_no,
             min(b.diagnosis_class) keep(dense_rank first order by decode(b.diagnosis_class, null, null, a.diagnosis_no) nulls last) diagnosis_class
from diagnostic_category a,
           diagnosis_dict b
where a.diagonosis_code = b.diagonosis_code(+)
group by a.patient;

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
7#
 楼主| 发表于 2012-12-11 23:32 | 只看该作者
bell6248 发表于 2012-12-11 20:43
lz, 测试一下如下的代码, 目前我给的代码是已经基于你贴的2表数据, 如果要加其他条件自己改一改即可, 如果 ...

明天测试

使用道具 举报

回复
论坛徽章:
6
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:292012新春纪念徽章
日期:2012-01-04 11:57:36ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-03-15 09:00:46优秀写手
日期:2014-11-28 06:00:15
8#
 楼主| 发表于 2012-12-12 15:18 | 只看该作者
bell6248 发表于 2012-12-11 20:43
lz, 测试一下如下的代码, 目前我给的代码是已经基于你贴的2表数据, 如果要加其他条件自己改一改即可, 如果 ...

经过测试,ok
你这里 decode(b.diagnosis_class, null, null, a.diagnosis_no) nulls 后面的nulls是重命名吗


使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
9#
发表于 2012-12-12 16:18 来自手机 | 只看该作者
isumsen 发表于 2012-12-12 15:18
经过测试,ok
你这里 decode(b.diagnosis_class, null, null, a.diagnosis_no) nulls 后面的nulls是重命 ...

是oracle sql语法, 可以参考oracle语法即可!

使用道具 举报

回复

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

本版积分规则 发表回复

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