求助!一道面试题的ETL实现,各种数据库实现都可以

zhuxu1234 2011-05-06 07:07:02
本人使用的是DB2 9.7,存储过程使用不熟练啊,请大牛给予帮助!
各种版本实现都行!
类似这样;
create table test.etltable(
name varchar(20) ,
seq integer,
money integer);

create table test.etltarget (
name varchar(20),
min_s integer,
max_s integer,
sum_money integer);

insert into test.etltable values
('A',1,100),
('A',2,200),
('A',3,300),
('A',8,400),
('A',9,500),
('B',1,100),
('B',2,500),
('B',5,600);

目标表结果应该是这样
A 1 3 600
A 8 9 900
B 1 2 600
B 5 5 600

...全文
462 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuxu1234 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 20804036 的回复:]
我写了一个,没用统计函数。
见笑了哈!


SQL code

with tt as
(select a.name,
a.seq,
a.money,
case--若存在上连续seq,则得到上连续seq
when exists (select 1
from et……
[/Quote]

sql写的挺漂亮
zhuxu1234 2011-06-22
  • 打赏
  • 举报
回复
O(∩_∩)O哈哈~谢谢大家支持!结贴给分!
20804036 2011-06-17
  • 打赏
  • 举报
回复
麻烦给分!
20804036 2011-06-17
  • 打赏
  • 举报
回复
我写了一个,没用统计函数。
见笑了哈!


with tt as
(select a.name,
a.seq,
a.money,
case--若存在上连续seq,则得到上连续seq
when exists (select 1
from etltable b
where b.name = a.name
and b.seq = a.seq - 1) then
a.seq - 1
else--否则上连续seq为本身
a.seq
end as mark1,
case--若存在下连续seq,则得到下连续seq
when exists (select 1
from etltable b
where b.name = a.name
and b.seq = a.seq + 1) then
a.seq + 1
else--否则下连续seq为本身
a.seq
end as mark2
from etltable a)
select dd.name,
dd.minseq,
dd.maxseq,(select sum(c.money)
from etltable c
where c.name = dd.name
and c.seq between dd.minseq and dd.maxseq)
from(select name,
mark1,
min(mark1) as minseq,
max(mark2) as maxseq
from (select a.* --获取连续数据,且可获取连续数据中最小上连续seq和最大上连续seq
from tt a, tt b
where a.name = b.name
and a.seq <> b.seq
and a.mark1 = b.mark1
union all
select a.* --获取孤立数据,最小上连续seq和最大上连续seq此时均为seq
from tt a
where mark1 = mark2)
group by name, mark1
order by name, min(seq)
) dd

Leon_He2014 2011-06-10
  • 打赏
  • 举报
回复
楼主好牛啊
hbjlwhl 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kondian 的回复:]
我改完之后,发现楼主自己写出来的是对的
只是没想到seq-row_num中间的-是减号的意思
哎。。。
[/Quote]

深有同感,楼主厉害啊!
kondian 2011-06-02
  • 打赏
  • 举报
回复
我改完之后,发现楼主自己写出来的是对的
只是没想到seq-row_num中间的-是减号的意思
哎。。。
kondian 2011-06-02
  • 打赏
  • 举报
回复
select name,min(seq),max(seq),sum(money)
from ( select name,seq,money,seq - row_num cha
from ( select name,seq,money,row_number() over(partition by name order by seq ) as row_num
from test.etltable ) ) group by name,cha;
hbjlwhl 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiexingxin 的回复:]
引用 6 楼 zhuxu1234 的回复:
突发灵感……解决了!O(∩_∩)O哈哈~
请各位批评指点!

select name,min(seq),max(seq),sum(money)
from ( select name,seq,money,row_num,seq-row_num as cha
from ( select name,seq,money,row_number() ov……
[/Quote]

seq-row_num 是什么东东啊?tks!
addictwudi 2011-06-01
  • 打赏
  • 举报
回复
试试用存储过程搞出来吧。
zhuxu1234 2011-05-11
  • 打赏
  • 举报
回复
怎么讲?
中间结果集如下
name seq money row_num cha
'A' 1 100 1 0
'A' 2 200 2 0
'A' 3 300 3 0
'A' 8 400 4 4
'A' 9 500 5 4
'B' 1 100 1 0
'B' 2 500 2 0

这样对name和cha进行分组就获得了对seq连续的分组
oO寒枫Oo 2011-05-11
  • 打赏
  • 举报
回复
ETL 怎么搞这来了。 不限制用一句话的话 用一个while就完事了
xiexingxin 2011-05-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhuxu1234 的回复:]
突发灵感……解决了!O(∩_∩)O哈哈~
请各位批评指点!

select name,min(seq),max(seq),sum(money)
from ( select name,seq,money,row_num,seq-row_num as cha
from ( select name,seq,money,row_number() over(partition by name ……
[/Quote]



好像还差点吧

select name,min(seq),max(seq),sum(money)
from ( select name,seq,money,row_num,seq-row_num as cha
from ( select name,seq,money,row_number() over(partition by name order by seq ) as row_num
from test.etltable ) ) group by name,cha;


zhuxu1234 2011-05-09
  • 打赏
  • 举报
回复
突发灵感……解决了!O(∩_∩)O哈哈~
请各位批评指点!

select name,min(seq),max(seq),sum(money)
from ( select name,seq,money,row_num,seq-row_num as cha
from ( select name,seq,money,row_number() over(partition by name ) as row_num
from test.etltable ) ) group by name,cha;
crazyzqh 2011-05-09
  • 打赏
  • 举报
回复
用过程来整吧, 游标中按第一字段,第二字段排序,然后判断是否连续。
单纯SQL语句,也可以搞,好像有分析函数可以像游标那样操作一行行的,复杂的很。
zhuxu1234 2011-05-07
  • 打赏
  • 举报
回复
判断etltable中第二列字段是否为连续一直没整出来,哎,惭愧……
zhuxu1234 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]

SQL code

insert into etltarget
select name,min(seq),max(seq),sum(money) from etltable group by name
[/Quote]

狼哥没看清转换后的目标表啊
这个要判断etltable中第二列字段是否为连续,需要将连续的取出最大值和最小值
ACMAIN_CHM 2011-05-06
  • 打赏
  • 举报
回复

insert into etltarget
select name,min(seq),max(seq),sum(money) from etltable group by name
推荐算法系统ETL数据处理实战 :一、课程优势本课程有陈敬雷老师的清华大学出版社配套新书教材《分布式机器学习实战》人工智能科学与技术丛书,新书教材配合此实战课程结合学习,一静一动,互补高效学习!本课程由互联网一线知名大牛陈敬雷老师全程亲自授课,技术前沿热门,是真正的互联网工业级实战项目。二、课程简介       搭建完数据仓库和平台之后,我们日常很多工作会做数据处理,也就是ETLETL分全量和增量两种处理方式,在推荐系统占用的工作量是比较大的,做一个算法系统,ETL数据处理的也是必须的。 下面来讲讲推荐的ETL数据处理是如何做的?我让我们体验下真实的用户实战场景!三、老师介绍陈敬雷  充电了么创始人,CEO兼CTO陈敬雷,北京充电了么科技有限公司创始人,CEO兼CTO,十几年互联网从业经验,曾就职于用友、中软、凡客、乐蜂网(唯品会)、猎聘网、人民日报(灵思云途)、北京万朝科技,曾任架构师、首席技术官、首席科学家等职务,对业务领域B端、C端、电商、职场社交招聘、内容文娱、营销行业都有着丰富的经验,在技术领域,尤其在大数据和人工智能方向有丰富的算法工程落地实战经验,其中在猎聘网任职期间主导的推荐算法系统项目获得公司优秀项目奖,推荐效果得到5倍的提升。 陈敬雷著有清华大学出版社两本人工智能书籍,分别是《分布式机器学习实战(人工智能科学与技术丛书)》已出版、《自然语言处理原理与实战(人工智能科学与技术丛书)》。 目前专注于大数据和人工智能驱动的上班族在线教育行业,研发了充电了么app和网站,用深度学习算法、nlp、推荐引擎等技术来高效提升在线学习效率。 

7,388

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 数据仓库
社区管理员
  • 数据仓库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧