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

 找回密码
 注册
查看: 653|回复: 7

[SQL] 询问个sql写法...

[复制链接]
认证徽章
论坛徽章:
1
弗兰奇
日期:2017-06-25 12:14:04
发表于 2017-5-17 18:40 | 显示全部楼层 |阅读模式
本帖最后由 wwwyibin518 于 2017-5-17 19:22 编辑

WITH V1 AS(
SELECT '1001' ID, 'A' TYPE, 'A1' COL1, 'AAAA1' COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'A' TYPE, 'A2' COL1, 'AAAA2' COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'B' TYPE, 'B1' COL1, NULL COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'C' TYPE, 'C1' COL1, 'CCCC2' COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'C' TYPE, 'C2' COL1, 'CCCC1' COL2 FROM DUAL
)
  SELECT V1.ID, V1.TYPE, V1.COL1, V1.COL2,
      MAX(COL1)  OVER(PARTITION BY V1.ID, V1.TYPE) COL1_BIG,
      MAX(COL2)  OVER(PARTITION BY V1.ID, V1.TYPE) COL2_BIG
  FROM V1
;

现在我查到的结果集如下.图1
14.png

怎样改写成下面的结果集 图2
COL1_BIG 和 COL2_BIG 的数据是 和COL1 COL2对应一行的.

ID和type分组下 COL1_BIG 和COL2_BIG 的枚举值都只有一个数值。
但是在同一行数据, COL1_BIG 和 COL2_BIG 要对应 某一行COL1和COL2
(图1的是乱了, C2和CCC1对应不了C2和CCC2)

..描述这个需求,感觉很吃力,,头脑逻辑不好使...不知道大家看懂我描述的逻辑没..


QQ图片20170517183329.png




论坛徽章:
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
发表于 2017-5-17 19:53 | 显示全部楼层
结果是如何的? 图2没有嘛

使用道具 举报

回复
论坛徽章:
459
探花
日期:2015-08-18 09:50:16秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-5-17 22:09 | 显示全部楼层
大致猜出楼主想要这个:

WITH V1 AS(
SELECT '1001' ID, 'A' TYPE, 'A1' COL1, 'AAAA1' COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'A' TYPE, 'A2' COL1, 'AAAA2' COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'B' TYPE, 'B1' COL1, NULL COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'C' TYPE, 'C1' COL1, 'CCCC2' COL2 FROM DUAL
UNION ALL
SELECT '1001' ID, 'C' TYPE, 'C2' COL1, 'CCCC1' COL2 FROM DUAL
)
  SELECT V1.ID, V1.TYPE, V1.COL1, V1.COL2,
      MAX(COL1)  OVER(PARTITION BY V1.ID, V1.TYPE) COL1_BIG,
      MAX(COL2)  KEEP(DENSE_RANK LAST ORDER BY COL1) OVER(PARTITION BY V1.ID, V1.TYPE) COL2_BIG
  FROM V1
;

使用道具 举报

回复
认证徽章
论坛徽章:
1
弗兰奇
日期:2017-06-25 12:14:04
发表于 2017-5-17 23:42 | 显示全部楼层
bell6248 发表于 2017-5-17 19:53
结果是如何的? 图2没有嘛

想要的结果是如图2,,但以我的功力只能做到图1,
图2的是我手动更改WITH子句的截图,文字描述不行,截图来凑

使用道具 举报

回复
认证徽章
论坛徽章:
1
弗兰奇
日期:2017-06-25 12:14:04
发表于 2017-5-17 23:42 | 显示全部楼层
newkid 发表于 2017-5-17 22:09
大致猜出楼主想要这个:

WITH V1 AS(

对啊.是我想要的效果.
  下班前发了帖子, 然后回家路上坐车时想到
想要的是max(COL1)和max(COL2)各自聚合后的数值有关联,
像有没类似 max(COL1,COL2) 这样的联合 聚合函数.
手机编辑帖子了,手机上看的是回复了.但是现在电脑上看回 手机回的楼不见了.

谢谢版主, 下午我摸索了一个多小时, 百度搜也不知道怎么描述好.. 也尝试换其他方法. 看到你的回复那个开心啊. 哈哈哈哈。就是想要这样。
分析函数,又学会多一个KEEP的用法了。谢谢

使用道具 举报

回复
论坛徽章:
10
2010新春纪念徽章
日期:2010-03-01 11:04:59喜羊羊
日期:2015-03-04 14:52:46优秀写手
日期:2014-04-22 06:00:18马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:24ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:012011新春纪念徽章
日期:2011-02-18 11:42:472015年新春福章
日期:2015-03-06 11:58:18
发表于 2017-5-18 09:15 | 显示全部楼层
newkid 发表于 2017-5-17 22:09
大致猜出楼主想要这个:

WITH V1 AS(

大师就是大师,不仅QUERY能写出超难度的query, 而且,能只要有一丝线索,就能理解超模糊的问题。

使用道具 举报

回复
论坛徽章:
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
发表于 2017-5-18 11:08 | 显示全部楼层
wwwyibin518 发表于 2017-5-17 23:42
想要的结果是如图2,,但以我的功力只能做到图1,
图2的是我手动更改WITH子句的截图,文字描述不行,截图来 ...



是这样的意思, 方法很多, 我也喜欢用newid的方法

SQL> WITH V1 AS(
  2  SELECT '1001' ID, 'A' TYPE, 'A1' COL1, 'AAAA1' COL2 FROM DUAL
  3  UNION ALL
  4  SELECT '1001' ID, 'A' TYPE, 'A2' COL1, 'AAAA2' COL2 FROM DUAL
  5  UNION ALL
  6  SELECT '1001' ID, 'B' TYPE, 'B1' COL1, NULL COL2 FROM DUAL
  7  UNION ALL
  8  SELECT '1001' ID, 'C' TYPE, 'C1' COL1, 'CCCC2' COL2 FROM DUAL
  9  UNION ALL
10  SELECT '1001' ID, 'C' TYPE, 'C2' COL1, 'CCCC1' COL2 FROM DUAL
11  )
12    SELECT V1.ID, V1.TYPE, V1.COL1, V1.COL2,
13        MAX(COL1)  OVER(PARTITION BY V1.ID, V1.TYPE) COL1_BIG,
14        last_value(col2) over(partition by id, type order by col1 range between unbounded preceding and unbounded following)  COL2_BIG
15    FROM V1;

ID   TYPE COL1 COL2  COL1_BIG COL2_BIG
---- ---- ---- ----- -------- --------
1001 A    A1   AAAA1 A2       AAAA2
1001 A    A2   AAAA2 A2       AAAA2
1001 B    B1         B1      
1001 C    C1   CCCC2 C2       CCCC1
1001 C    C2   CCCC1 C2       CCCC1

SQL>




使用道具 举报

回复
认证徽章
论坛徽章:
1
弗兰奇
日期:2017-06-25 12:14:04
发表于 2017-5-18 17:28 | 显示全部楼层
bell6248 发表于 2017-5-18 11:08
是这样的意思, 方法很多, 我也喜欢用newid的方法

SQL> WITH V1 AS(

哈,条条大路通罗马。我对于分析函数,理解和认识实在太浅层了.  over的 partition子句 order by子句用得多,但是没有去关注和运用后面的 range子句..
谢谢大神的解答

使用道具 举报

回复

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

本版积分规则

SACC2017购票7.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月30日前

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