相信我,我已经为这个问题找到了运气.我有MYSQL& SQLServer解决方案而不是Oracle而不是我需要的具体汇总.
由于我正在使用的Oracle版本中没有Cross Apply,我遇到了障碍.
对你们许多人来说问题很简单.
对我而言,宇宙起步已经持续了13个月.
我有一张桌子
CREATE TABLE TBLTESTAUM (
ORDER_NO NUMBER(10,0) NOT NULL ENABLE,
RECORD_DATE DATE,
Order_SEQUENCE NUMBER(5,0) NOT NULL ENABLE,
CLASS NUMBER(3,0));
INSERT INTO TBLTESTAUM VALUES (1234, '29-Aug-2015', 34, 459);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Jun-2016', 35, 877);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Jun-2016', 37, 877);
INSERT INTO TBLTESTAUM VALUES (1234, '02-Jul-2016', 39, 122);
INSERT INTO TBLTESTAUM VALUES (1234, '28-Jul-2016', 40, 122);
INSERT INTO TBLTESTAUM VALUES (1234, '31-Jul-2016', 41, 311);
INSERT INTO TBLTESTAUM VALUES (1234, '10-Aug-2016', 42, 311);
INSERT INTO TBLTESTAUM VALUES (1234, '18-Aug-2016', 44, 110);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Aug-2016', 45, 110);
请注意 :
> 2015年7月20日第一次插入.
> Seq字段可能有也可能没有每个值.它可能会遗漏一些.如果你想使用它.
> Not Nullable for Sequence是可忽略的.
所以滚动13个月给了我22/07/2015,截至今天.
我希望在每周“CLASS”情况下将其分解,如果那个星期没有任何内容,那么最后一次应用CLASS.如果没有任何结果,即它是第一个实例,则接下来应用CLASS.直到CLASS更改.
输出为 –
Order Num WeekDate CLASS
123 27-Jul-15 459
123 3-Aug-15 459
123 10-Aug-15 459
123 17-Aug-15 459
123 24-Aug-15 459
123 31-Aug-15 459
123 7-Sep-15 459
Dates and Order Num to continue till next match in TBLTESTAUM is found
123 20-Jun-16 877
123 27-Jun-16 122
123 4-Jul-16 122
123 11-Jul-16 122
123 25-Jul-16 311
123 1-Aug-16 311
123 8-Aug-16 311
123 15-Aug-16 110
123 22-Aug-16 110
有多个订单号.但我希望你的代码适合所有人.
请注意
它需要累积到每周状态.
需要执行月度状态.但希望我能从你的代码中找出答案.
先感谢您.
PS:我将无法查看您未来10小时的回复.男人睡了但是你真的很感激你花在这上面的时间.
最佳答案 以下查询可能会满足您的需求.如果没有,请解释与您的要求相比有何不同. (请回答我在评论中提出的问题).
在这个解决方案中,我生成了所需的日期(首先是星期日,因为你想捕获“当前周”期间发生的事情,然后我在最后的外部查询中将它们更改为星期一).我也从你提供的表中生成order_no,但是在一个有意义的现实生活中,这是不必要的;你应该有一个“order”表,其order_no与主键相同,我的CTE“o”应该从该表中提取订单号,而不是从tbltestaum中提取订单号.
祝好运!
with
w ( weekdate ) as (
select trunc(sysdate, 'iw') - 7 * (level - 1) + 6 -- This will generate Sundays
from dual
connect by level <= 1 +
( trunc(sysdate, 'iw') - trunc(add_months(sysdate, -13), 'iw') ) / 7
),
o ( order_no ) as (
select distinct order_no from tbltestaum
),
prep ( order_no, dt, order_sequence, class ) as (
select order_no, record_date, order_sequence, class
from tbltestaum
union all
select order_no, weekdate, null, null
from w cross join o
),
z ( order_no, dt, order_sequence, class ) as (
select order_no, dt, order_sequence,
nvl( last_value(class ignore nulls) over (partition by order_no
order by dt, order_sequence),
first_value(class ignore nulls) over (partition by order_no
order by dt, order_sequence
rows between unbounded preceding and unbounded following ) )
from prep
)
select order_no, to_char(dt - 6, 'dd-Mon-yy') as weekdate, class
from z
where order_sequence is null
;