如果缺少特定数据的数据,则从前一天到第二天填写数据,并且仅填写周六和周日的日期
Fill data from previous date to next day date if data for specific data is missing and fill only for days Saturday and Sunday
我有一个名为 DATA 的 Table,它将有一段时间的数据。 Table 例子
currency indicator Frequency Date Value
AED/USD KN.I1 M 2022-04-15 10
AED/USD KN.I2 M 2022-04-15 10
AED/USD KN.I3 M 2022-04-15 10
AED/USD KN.I4 M 2022-04-15 10
AED/USD KN.I5 M 2022-04-15 10
AED/USD KN.I5 M 2022-04-16 15
我们可以看到日期“2022-04-15”是星期五,日期“2022-04-16”是星期六。如果该行丢失或值为空(下一个日期应为 星期六或星期日 和日期,我希望下一个日期的同一行具有相同的值 2022-04-15不应超过当前日期)。如果该日期的值已经存在,它也不应该插入该行 - 显示在预期输出中
预期输出
currency indicator Frequency Date Value
AED/USD KN.I1 M 2022-04-15 10
AED/USD KN.I1 M 2022-04-16 10
AED/USD KN.I2 M 2022-04-15 10
AED/USD KN.I2 M 2022-04-16 10
AED/USD KN.I3 M 2022-04-15 10
AED/USD KN.I3 M 2022-04-16 10
AED/USD KN.I4 M 2022-04-15 10
AED/USD KN.I4 M 2022-04-16 10
AED/USD KN.I5 M 2022-04-15 10
AED/USD KN.I5 M 2022-04-16 15 -- This row already exists and not to be filled by previous value
正如我们在输出文件中看到的那样,它添加了与前一个日期具有相同值的新行(2022-04-16 是星期六)。当前日期是 2022-04-16(假设它是当前日期)因此它不应为 2022-04-17(星期日)
添加行
我提到了这个 但它看起来与我的问题无关。请有人帮我解决这个问题
您想通过 ROW_NUMBER / GENERATOR 模式填充数据间隙:
SELECT row_number() over (order by null)-1 as rn
FROM table(generator(ROWCOUNT => 1000))
然后用 LAG
值填充值差距
nvl(value, lag(value) ignore nulls over (partition by currency order by date)) as value
变成:
with data(currency,indicator,Frequency,Date,Value) as (
select * from values
('AED/USD', 'KN.I1', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I2', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I3', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I4', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I5', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I5', 'M', '2022-04-16'::date, 15)
), range as (
SELECT row_number() over (order by null)-1 as rn
FROM table(generator(ROWCOUNT => 1000))
), mins as (
select currency, indicator, min(date) as min_date
from data
group by 1,2
), mix as (
select m.currency, m.indicator, dateadd(day, r.rn, m.min_date) as day_date
from mins as m
join range as r
qualify day_date <= current_date()
)
select
m.currency,
m.indicator,
m.day_date as date,
nvl(d.value, lag(d.value) ignore nulls over (partition by m.currency, m.indicator order by m.day_date)) as value
from mix as m
left join data as d
on m.currency = d.currency and m.indicator = d.indicator and d.date = m.day_date
order by 1,2,3;
CURRENCY
INDICATOR
DATE
VALUE
AED/USD
KN.I1
2022-04-15
10
AED/USD
KN.I1
2022-04-16
10
AED/USD
KN.I1
2022-04-17
10
AED/USD
KN.I1
2022-04-18
10
AED/USD
KN.I1
2022-04-19
10
AED/USD
KN.I2
2022-04-15
10
AED/USD
KN.I2
2022-04-16
10
AED/USD
KN.I2
2022-04-17
10
AED/USD
KN.I2
2022-04-18
10
AED/USD
KN.I2
2022-04-19
10
AED/USD
KN.I3
2022-04-15
10
AED/USD
KN.I3
2022-04-16
10
AED/USD
KN.I3
2022-04-17
10
AED/USD
KN.I3
2022-04-18
10
AED/USD
KN.I3
2022-04-19
10
AED/USD
KN.I4
2022-04-15
10
AED/USD
KN.I4
2022-04-16
10
AED/USD
KN.I4
2022-04-17
10
AED/USD
KN.I4
2022-04-18
10
AED/USD
KN.I4
2022-04-19
10
AED/USD
KN.I5
2022-04-15
10
AED/USD
KN.I5
2022-04-16
15
AED/USD
KN.I5
2022-04-17
15
AED/USD
KN.I5
2022-04-18
15
AED/USD
KN.I5
2022-04-19
15
我有一个名为 DATA 的 Table,它将有一段时间的数据。 Table 例子
currency indicator Frequency Date Value
AED/USD KN.I1 M 2022-04-15 10
AED/USD KN.I2 M 2022-04-15 10
AED/USD KN.I3 M 2022-04-15 10
AED/USD KN.I4 M 2022-04-15 10
AED/USD KN.I5 M 2022-04-15 10
AED/USD KN.I5 M 2022-04-16 15
我们可以看到日期“2022-04-15”是星期五,日期“2022-04-16”是星期六。如果该行丢失或值为空(下一个日期应为 星期六或星期日 和日期,我希望下一个日期的同一行具有相同的值 2022-04-15不应超过当前日期)。如果该日期的值已经存在,它也不应该插入该行 - 显示在预期输出中
预期输出
currency indicator Frequency Date Value
AED/USD KN.I1 M 2022-04-15 10
AED/USD KN.I1 M 2022-04-16 10
AED/USD KN.I2 M 2022-04-15 10
AED/USD KN.I2 M 2022-04-16 10
AED/USD KN.I3 M 2022-04-15 10
AED/USD KN.I3 M 2022-04-16 10
AED/USD KN.I4 M 2022-04-15 10
AED/USD KN.I4 M 2022-04-16 10
AED/USD KN.I5 M 2022-04-15 10
AED/USD KN.I5 M 2022-04-16 15 -- This row already exists and not to be filled by previous value
正如我们在输出文件中看到的那样,它添加了与前一个日期具有相同值的新行(2022-04-16 是星期六)。当前日期是 2022-04-16(假设它是当前日期)因此它不应为 2022-04-17(星期日)
添加行我提到了这个
您想通过 ROW_NUMBER / GENERATOR 模式填充数据间隙:
SELECT row_number() over (order by null)-1 as rn
FROM table(generator(ROWCOUNT => 1000))
然后用 LAG
值填充值差距nvl(value, lag(value) ignore nulls over (partition by currency order by date)) as value
变成:
with data(currency,indicator,Frequency,Date,Value) as (
select * from values
('AED/USD', 'KN.I1', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I2', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I3', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I4', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I5', 'M', '2022-04-15'::date, 10),
('AED/USD', 'KN.I5', 'M', '2022-04-16'::date, 15)
), range as (
SELECT row_number() over (order by null)-1 as rn
FROM table(generator(ROWCOUNT => 1000))
), mins as (
select currency, indicator, min(date) as min_date
from data
group by 1,2
), mix as (
select m.currency, m.indicator, dateadd(day, r.rn, m.min_date) as day_date
from mins as m
join range as r
qualify day_date <= current_date()
)
select
m.currency,
m.indicator,
m.day_date as date,
nvl(d.value, lag(d.value) ignore nulls over (partition by m.currency, m.indicator order by m.day_date)) as value
from mix as m
left join data as d
on m.currency = d.currency and m.indicator = d.indicator and d.date = m.day_date
order by 1,2,3;
CURRENCY | INDICATOR | DATE | VALUE |
---|---|---|---|
AED/USD | KN.I1 | 2022-04-15 | 10 |
AED/USD | KN.I1 | 2022-04-16 | 10 |
AED/USD | KN.I1 | 2022-04-17 | 10 |
AED/USD | KN.I1 | 2022-04-18 | 10 |
AED/USD | KN.I1 | 2022-04-19 | 10 |
AED/USD | KN.I2 | 2022-04-15 | 10 |
AED/USD | KN.I2 | 2022-04-16 | 10 |
AED/USD | KN.I2 | 2022-04-17 | 10 |
AED/USD | KN.I2 | 2022-04-18 | 10 |
AED/USD | KN.I2 | 2022-04-19 | 10 |
AED/USD | KN.I3 | 2022-04-15 | 10 |
AED/USD | KN.I3 | 2022-04-16 | 10 |
AED/USD | KN.I3 | 2022-04-17 | 10 |
AED/USD | KN.I3 | 2022-04-18 | 10 |
AED/USD | KN.I3 | 2022-04-19 | 10 |
AED/USD | KN.I4 | 2022-04-15 | 10 |
AED/USD | KN.I4 | 2022-04-16 | 10 |
AED/USD | KN.I4 | 2022-04-17 | 10 |
AED/USD | KN.I4 | 2022-04-18 | 10 |
AED/USD | KN.I4 | 2022-04-19 | 10 |
AED/USD | KN.I5 | 2022-04-15 | 10 |
AED/USD | KN.I5 | 2022-04-16 | 15 |
AED/USD | KN.I5 | 2022-04-17 | 15 |
AED/USD | KN.I5 | 2022-04-18 | 15 |
AED/USD | KN.I5 | 2022-04-19 | 15 |