如果缺少特定数据的数据,则从前一天到第二天填写数据,并且仅填写周六和周日的日期

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