一、产品表Product,用于存放产品基本信息
ID NAME WORK_TIME(最后一次工作时间)
1 S1 2014-2-10 10:30:00
2 A1 2014-4-1 13:30:00
......
二、产品工作时间月表,每月自动创建,表名为Product_日期(比如Product_201402),此表会记录产品每天每次开机工作时间小时,就是一个产品每天会有多条数据,记录的是一开一关的时间,因为它不是24小时开机工作,而且数据量巨大,每月超过100万条记录
ID Product_ID WORK_HOUSE(工作小时) ON_TIME(开始工作时间)
1 1 5 2014-2-1 08:30:00
2 1 2 2014-2-9 08:30:00
3 1 1 2014-2-10 10:36:05
4 2 3 2014-4-1 13:00:00
5 2 3 2014-4-2 14:30:00
.......
现在我要列出所有产品,然后根据产品最后一次工作时间,取得最后工作时间前两日的工作总小时数,比如上面的测试数据最终获得是
ID NAME WORK_TIME(最后一次工作时间) LAST_WORK_HOUSE
1 S1 2014-2-10 10:30:00 3
2 A1 2014-4-1 13:30:00 3
------解决思路----------------------
SELECT T1.ID,
T1.NAME,
T1.WORK_TIME,
(SELECT SUM(WORK_HOUSE)
FROM (SELECT WORK_HOUSE,
ROW_NUMBER() OVER(ORDER BY ON_TIME DESC) RN
FROM PRODUCT_201402 T2
WHERE TO_CHAR(T2.ON_TIME, 'yyyymmdd') <=
TO_CHAR(T1.WORK_TIME, 'yyyymmdd')
AND T1.ID = T2.ID) T
WHERE T.RN <= 2)
FROM PRODUCT T1
------解决思路----------------------
如果表名都是变动的,我觉得用一个SQL很难办。必须用存储过程+动态SQL来完成