gpt4 book ai didi

sql - 填补缺失数据 Oracle

转载 作者:行者123 更新时间:2023-12-04 22:07:07 26 4
gpt4 key购买 nike

相信我,我已经试过运气来解决这个问题。我有 MYSQL 和 SQLServer 解决方案,但没有 Oracle,也没有我需要的特定汇总。由于交叉应用在我使用的 Oracle 版本中不可用,我遇到了障碍。

对于你们中的许多人来说,问题很简单。

对我来说宇宙的开始是滚动 13 个月。

我有一张 table

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);

请注意:

  1. 2015 年 7 月 20 日首次插入。
  2. Seq 字段可能有也可能没有每个值。它可能会丢失一些。如果你想使用它。
  3. 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 小时内无法查看您的回复。男人得 sleep 了。但真的很感激你花在这上面的任何时间。

最佳答案

下面的查询可能会满足您的需要。如果不是,请说明与您的要求相比有何不同。 (也请回答我在对您的问题发表评论时提出的问题)。

在此解决方案中,我生成了所需的日期(首先是星期日,因为您想捕获“本周”期间发生的事情,然后我在最终的外部查询中将它们更改为星期一)。我还从您提供的表格中生成了 order_no,但是在有意义的现实生活中这不是必需的;您应该有一个“订单”表,其 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
;

关于sql - 填补缺失数据 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39078887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com