求助!求助!一个业务场景不知道怎么用sql来写

[复制链接]
查看11 | 回复9 | 2012-5-21 10:19:41 | 显示全部楼层 |阅读模式
上周,一个开发问了我一个很简单的业务场景,怎么用sql来实现,太菜了,不会写,请大神们帮小弟瞅瞅呗。
测试数据如下:
select * from test_for_cdr order by dd, org_code;
DDORG_CODE

12
3

12
5

12
7

13
1

13
5

13
7

13
11

14
1

14
4

14
5

14
6

14
7

16
5

16
7

16
15

求出按照DD字段(该字段可理解为组号)正序排序后,每一组比下一组多出的数字。
正确查询结果:
123
1311
141
144
146
最后一组因为没有下一组了,所以不用管,只要求出上一组比下一组多的数字,每一组中的org_code不会有重复!
麻烦各位大佬了!

回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
3组14
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
〇〇 发表于 2018-11-11 20:56
3组14

卢老师您好,请我您说的这个是啥意思呀

,这个题我用表的自关联可以做,但生产上的表太多数据了,自关联的话,我怕吃不消,所以我想问一下,有没有尽量不用自关联的方法呢
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层


2018-11-12_092215.png (5.35 KB, 下载次数: 13)
下载附件
2018-11-12 09:19 上传


回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
〇〇 发表于 2018-11-12 09:19
对啊,正确答案里面是有三组14的啊,比第4组多出了1,4,6这三个数字嘛
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
才理解你写的多出的数字,

2018-11-12_094212.png (3.89 KB, 下载次数: 13)
下载附件
2018-11-12 09:40 上传
,这个怎么解释?


回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
SQL> create tabletest_for_cdr(DD int, ORG_CODE int);
Table created
SQL> create or replace type numlist is table of int;
2/
Type created
SQL>
SQL> with t as
2 (select dd, cast(collect(org_code) as numlist) code_list
3from test_for_cdr
4 group by dd
5 order by dd)
6select dd, column_value
7from (select dd, code_list multiset EXCEPT next_code_list res_code_list
8
from (select dd,
9
code_list,
10
(select code_list from t where dd = next_dd) next_code_list
11
from (select dd,
12
code_list,
13
lead(dd) over(order by dd) next_dd
14
from t))),
15 table(res_code_list)
16/

DD COLUMN_VALUE
--------------------------------------- ------------

12
3

13 11

14
1

14
6

14
4
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
〇〇 发表于 2018-11-12 09:40
才理解你写的多出的数字,,这个怎么解释?

老师,其实就是取差集的意思嘛


你看,12组里面是3,5,7 13组里面是1,5,7,11
{3,5,7} minus {1,5,7,11} 不就是 3嘛,就是前面一组比后面多出的数字嘛
然后13组{1,5,7,11}和14组{1,4,5,6,7}的差集就是11嘛
把每一组看成一个集合就好啦

,每个集合里面的org_code是不重复的
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
solomon_007 发表于 2018-11-12 09:52
SQL> create tabletest_for_cdr(DD int, ORG_CODE int);
Table created

好的大神,我用你这个试一下
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
原来是前一组减后一组,以为是后减前
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行