一个数据库算法问题,请教各位大神!

时间:2022-12-11 18:18:10
我是个新人,今天发了一个贴,但是在电脑上刷屏没有刷出来,我以为没有发送成功,所以又发了几次,现在被限制发帖。只能重新注册个号,再详细描述下问题。跪请各位大神指教,感激不尽!!!
现在有两张表:
表1:一个字段为id,time,c1,c2
表1:一个字段为id,time,c3
还有一个计算公式,例如c1+c2/c3,
现在需要生成一个动态表:字段为id,time,c1,c2,c3,result,其中result存放c1,c2,c3通过公式计算的结果。
c1、c2字段的数据通过下面的sq语句按照id进行汇总,汇总算法为求和:
select sum(c1),sum(c2) from table1 group by id,time;
c3字段的数据通过下面的sq语句按照id进行汇总,汇总算法为求和:
select sum(c3)  from table2 group by id,time;
现在需要将c1、c2和c3汇总的数据先放到缓存里(因为字段来自不同的表,所以直接插入到目标表效率较低),然后再将缓存里的数据逐条插入到目标表里,然后再从目标表里取出数据按照公式进行计算,插入到result字段。

请大神们指教下这个问题有没有比较高效的实现方法,小弟刚学习java不久,写了实现代码,但是感觉太繁琐,跪求大侠们指教~~
举个例子:
例如table1 数据如下:
id      time          c1  c2
1  2017/10/29   1     2
1  2017/10/29   2     4
2  2017/10/29   3     6
2  2017/10/29   4     8
1  2017/10/30   1     2
1  2017/10/30   2     4
2  2017/10/39   3     6
2  2017/10/30   4     8
那么执行如下语句
select sum(c1),sum(c2) from table1 group by id,time;
结果是
id      time         c1  c2
1  2017/10/29   3    6
2  2017/10/29   7    14
1  2017/10/30   3    6
2  2017/10/30   7    14

同理假设talbe2进行group后得到以下数据:
id      time          c3
1  2017/10/29    3
2  2017/10/29    3   
1  2017/10/30    3    
2  2017/10/30    3  

现在计算公式是result = (c1+c2)/c3,那么希望得到最后的表数据是
id      time          c1  c2 c3  result
1  2017/10/29   3    6    3    3
2  2017/10/29   7    14  3   7
1  2017/10/30   3     6    3   3
2  2017/10/30   7    14  3   7

4 个解决方案

#1


--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([id] int,[time] Date,[c1] int,[c2] int)
Insert #T1
select 1,'2017/10/29',3,6 union all
select 2,'2017/10/29',7,14 union all
select 1,'2017/10/30',3,6 union all
select 2,'2017/10/30',7,14
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([id] int,[time] Date,[c3] int)
Insert #T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3
Go
--测试数据结束
--上边那两个是group玩之后的结果表
--然后不要一条一条的插入数据了,直接一次性读取插入
SELECT  #T1.id ,
        #T1.time ,
        c1 ,
        c2 ,
        c3 ,
        ( c1 + c2 ) / c3 AS result
FROM    #T1
        JOIN #T2 ON #T2.id = #T1.id
                    AND #T2.time = #T1.time;


一个数据库算法问题,请教各位大神!

#2


declare @T1 table ([id] int,[time] Date,[c1] int,[c2] int)
Insert @T1
select 1,'2017/10/29',1,2 union all
select 1,'2017/10/29',2,4 union all
select 2,'2017/10/29',3,6 union all
select 2,'2017/10/29',4,8 union all
select 1,'2017/10/30',1,2 union all
select 1,'2017/10/30',2,4 union all
select 2,'2017/10/30',3,6 union all
select 2,'2017/10/30',4,8

declare @T2 table([id] int,[time] Date,[c3] int)
Insert @T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3

select t1.id,t1.time,t1.c1,t1.c2,t2.c3,(c1+c2)/c3 result
from (select id,time,sum(c1)c1,sum(c2)c2 from @t1 group by id,time) t1 
left join 
(select id,time,sum(c3)c3 from @t2 group by id,time) t2
on t1.id=t2.id and t1.time=t2.time
/*
1 2017-10-29 3 6 3 3
1 2017-10-30 3 6 3 3
2 2017-10-29 7 14 3 7
2 2017-10-30 7 14 3 7
*/

#3


多谢各位大神的回复。不过有个问题,是我忘记描述了,就是C1,C2,C3可能来自不同的表,这个在下面的表中定义:
id         tableid 
c1       111
c2       222
c3       333
其中tableid是另外一张表的主键,这张表定义了这个字段来哪张表的哪个字段。例如
id     tablename field
111    table1       a 
222   table2       b 
333  table3        c
就是说c1来自 table1的a字段,依次类推,而且需要将c1,c2,c3 group by的结果用java语言放到内存里,然后用公式算出结果,再将id 、time、c1、c2、c3、result插入到一个表中,要用java实现,根据好复杂。。。

#4


就是 id,time 每个表都默认存在 就 c1,c2这些需要sum先?
那就根据你的 配置表 表 进行拼接 sql or java端都可以做

#1


--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([id] int,[time] Date,[c1] int,[c2] int)
Insert #T1
select 1,'2017/10/29',3,6 union all
select 2,'2017/10/29',7,14 union all
select 1,'2017/10/30',3,6 union all
select 2,'2017/10/30',7,14
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([id] int,[time] Date,[c3] int)
Insert #T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3
Go
--测试数据结束
--上边那两个是group玩之后的结果表
--然后不要一条一条的插入数据了,直接一次性读取插入
SELECT  #T1.id ,
        #T1.time ,
        c1 ,
        c2 ,
        c3 ,
        ( c1 + c2 ) / c3 AS result
FROM    #T1
        JOIN #T2 ON #T2.id = #T1.id
                    AND #T2.time = #T1.time;


一个数据库算法问题,请教各位大神!

#2


declare @T1 table ([id] int,[time] Date,[c1] int,[c2] int)
Insert @T1
select 1,'2017/10/29',1,2 union all
select 1,'2017/10/29',2,4 union all
select 2,'2017/10/29',3,6 union all
select 2,'2017/10/29',4,8 union all
select 1,'2017/10/30',1,2 union all
select 1,'2017/10/30',2,4 union all
select 2,'2017/10/30',3,6 union all
select 2,'2017/10/30',4,8

declare @T2 table([id] int,[time] Date,[c3] int)
Insert @T2
select 1,'2017/10/29',3 union all
select 2,'2017/10/29',3 union all
select 1,'2017/10/30',3 union all
select 2,'2017/10/30',3

select t1.id,t1.time,t1.c1,t1.c2,t2.c3,(c1+c2)/c3 result
from (select id,time,sum(c1)c1,sum(c2)c2 from @t1 group by id,time) t1 
left join 
(select id,time,sum(c3)c3 from @t2 group by id,time) t2
on t1.id=t2.id and t1.time=t2.time
/*
1 2017-10-29 3 6 3 3
1 2017-10-30 3 6 3 3
2 2017-10-29 7 14 3 7
2 2017-10-30 7 14 3 7
*/

#3


多谢各位大神的回复。不过有个问题,是我忘记描述了,就是C1,C2,C3可能来自不同的表,这个在下面的表中定义:
id         tableid 
c1       111
c2       222
c3       333
其中tableid是另外一张表的主键,这张表定义了这个字段来哪张表的哪个字段。例如
id     tablename field
111    table1       a 
222   table2       b 
333  table3        c
就是说c1来自 table1的a字段,依次类推,而且需要将c1,c2,c3 group by的结果用java语言放到内存里,然后用公式算出结果,再将id 、time、c1、c2、c3、result插入到一个表中,要用java实现,根据好复杂。。。

#4


就是 id,time 每个表都默认存在 就 c1,c2这些需要sum先?
那就根据你的 配置表 表 进行拼接 sql or java端都可以做