【问题标题】:SQL/Snowflake - Add rows of future dates and populate with last value from another tableSQL/Snowflake - 添加未来日期的行并使用另一个表中的最后一个值填充
【发布时间】:2021-12-21 20:31:27
【问题描述】:

我有 4 列,“DateByQuarter”、“FromCurrency”、“ToCurrency”、“Rate” - 这是在一个表中。最终的“DateByQuarter”值为“2021-09-30”,此数据集在每个季度末更新(例如,下一组货币对将于 2021-12-31 上传)

我的目标是创建一个新表,我可以在该表下方的行中动态添加价值 7 年的季度,并使用最后可用的货币汇率填充它。例如,由于 2021-09-30 是此处的最后日期,因此未来 7 年的所有货币汇率都将以此为基础。

到目前为止,我找不到一个简单的方法来做到这一点,非常感谢任何帮助!

->添加了下表的示例; 2021 年 12 月 31 日起采用 2021 年 9 月 30 日起所有货币对的汇率。

DatebyQuarter FromCurrency ToCurrency Rate
2021-03-31 USD EUR 0.85
2021-03-31 USD INR 74.27
2021-03-31 USD CAD 1.24
2021-06-30 USD EUR 0.86
2021-06-30 USD EUR 74.32
2021-06-30 USD CAD 1.22
2021-09-30 USD EUR 0.85
2021-09-30 USD EUR 73.09
2021-09-30 USD CAD 1.26
2021-12-31 USD EUR 0.85
2021-12-31 USD EUR 73.09
2021-12-31 USD CAD 1.26
2022-03-31 USD EUR 0.85
2022-03-31 USD EUR 73.09
2022-03-31 USD CAD 1.26
2022-06-30 USD EUR 0.85
2022-06-30 USD EUR 73.09
2022-06-30 USD CAD 1.26
2022-09-30 USD EUR 0.85
2022-09-30 USD EUR 73.09
2022-09-30 USD CAD 1.26
2022-12-31 USD EUR 0.85
2022-12-31 USD EUR 73.09
2022-12-31 USD CAD 1.26
2023-03-31 USD EUR 0.85
2023-03-31 USD EUR 73.09
2023-03-31 USD CAD 1.26
2023-06-30 USD EUR 0.85
2023-06-30 USD EUR 73.09
2023-06-30 USD CAD 1.26
2023-09-30 USD EUR 0.85
2023-09-30 USD EUR 73.09
2023-09-30 USD CAD 1.26
2023-12-31 USD EUR 0.85
2023-12-31 USD EUR 73.09
2023-12-31 USD CAD 1.26
2024-03-31 USD EUR 0.85
2024-03-31 USD EUR 73.09
2024-03-31 USD CAD 1.26
2024-06-30 USD EUR 0.85
2024-06-30 USD EUR 73.09
2024-06-30 USD CAD 1.26
2024-09-30 USD EUR 0.85
2024-09-30 USD EUR 73.09
2024-09-30 USD CAD 1.26
2024-12-31 USD EUR 0.85
2024-12-31 USD EUR 73.09
2024-12-31 USD CAD 1.26
2025-03-31 USD EUR 0.85
2025-03-31 USD EUR 73.09
2025-03-31 USD CAD 1.26
2025-06-30 USD EUR 0.85
2025-06-30 USD EUR 73.09
2025-06-30 USD CAD 1.26
2025-09-30 USD EUR 0.85
2025-09-30 USD EUR 73.09
2025-09-30 USD CAD 1.26
2025-12-31 USD EUR 0.85
2025-12-31 USD EUR 73.09
2025-12-31 USD CAD 1.26
2026-03-31 USD EUR 0.85
2026-03-31 USD EUR 73.09
2026-03-31 USD CAD 1.26
2026-06-30 USD EUR 0.85
2026-06-30 USD EUR 73.09
2026-06-30 USD CAD 1.26
2026-09-30 USD EUR 0.85
2026-09-30 USD EUR 73.09
2026-09-30 USD CAD 1.26
2026-12-31 USD EUR 0.85
2026-12-31 USD EUR 73.09
2026-12-31 USD CAD 1.26
2027-03-31 USD EUR 0.85
2027-03-31 USD EUR 73.09
2027-03-31 USD CAD 1.26
2027-06-30 USD EUR 0.85
2027-06-30 USD EUR 73.09
2027-06-30 USD CAD 1.26
2027-09-30 USD EUR 0.85
2027-09-30 USD EUR 73.09
2027-09-30 USD CAD 1.26
2027-12-31 USD EUR 0.85
2027-12-31 USD EUR 73.09
2027-12-31 USD CAD 1.26
2028-03-31 USD EUR 0.85
2028-03-31 USD EUR 73.09
2028-03-31 USD CAD 1.26
2028-06-30 USD EUR 0.85
2028-06-30 USD EUR 73.09
2028-06-30 USD CAD 1.26
2028-09-30 USD EUR 0.85
2028-09-30 USD EUR 73.09
2028-09-30 USD CAD 1.26
2028-12-31 USD EUR 0.85
2028-12-31 USD EUR 73.09
2028-12-31 USD CAD 1.26

【问题讨论】:

  • 请分享一些示例数据和期望的结果
  • DateByQuarter 列中的值是否总是该季度的最后一个日期?您生成过去 7 年或未来 7 年的数据?就像 Felipe 提到的那样,样本数据和预期输出可能有助于澄清事情。
  • 感谢费利佩和埃里克!包括样本数据/所需结果。这里的想法是将未来的费率附加到同一张表中。对于 Eric 的问题,是的,每个季度的最后一个日期都在 DateByQuarter 列中,其中包含未来 7 年的数据。

标签: sql snowflake-cloud-data-platform


【解决方案1】:

尝试这种方法,我能够在 SELECT 语句中将最后一个比率分配给所有未来季度,您可以使用相同的方法来更新表。

create table  cur_rate (qat_end date, src_cur varchar2(5), tgt_cur varchar2(5), rate number(6,3));

SELECT CUR_ALL.*, LST_RT.* FROM cur_rate CUR_ALL
JOIN (select qat_end, src_cur, tgt_cur, rate 
    from cur_rate
    where rate is not null
    qualify row_number() over (partition by TGT_CUR order by QAT_END desc) = 1
      ) LST_RT ON LST_RT.tgt_CUR = CUR_ALL.tgt_CUr
      -- you can add other column in the join condition LST_RT.src_cur = cur_all.src_cur =  also 
      ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多