【问题标题】:How to choose the previous closest value in sql如何在sql中选择上一个最接近的值
【发布时间】:2018-05-02 05:20:52
【问题描述】:

现在我有 2 张桌子:

*表格1 -* 日期               汇率 00/00/0000      0.6 2018 年 4 月 1 日          0.81 2018 年 4 月 2 日     0.82 2018 年 5 月 1 日          0.83 2018 年 5 月 2 日          0.81 2018 年 5 月 3 日          0.82

*表2-*

日期                  美元 2018 年 2 月 2 日            50 2018 年 3 月 5 日            60 2018 年 4 月 1 日            50 2018 年 4 月 3 日            100 2018 年 4 月 15 日          200 2018 年 5 月 1 日            60 2018 年 5 月 2 日            80 2018 年 5 月 3 日            90

我想要一个反映转换金额的表 3 *Table3 -*

日期                美元        转换金额 2018 年 2 月 2 日            50          50*0.6 = 30 2018 年 3 月 5 日            60          60*0.6 = 36 2018 年 4 月 1 日            50          50*0.81 = 40.5 2018 年 4 月 3 日            100        100*0.82 = 82 2018 年 4 月 15 日          200        200*0.82 = 164 2018 年 5 月 1 日            60          60*0.83 = 49.8 2018 年 5 月 2 日            80          80*0.81 = 64.8 2018 年 5 月 3 日            90          90*0.82 = 73.8

如何在 SQL 中实现这一点?原始数据很大。

问题是我希望 Table3 的 2018 年 4 月 15 日和 2018 年 4 月 3 日的转换金额遵循 2018 年 4 月 2 日的汇率,因为没有 2018 年 4 月 15 日或 2018 年 4 月 3 日的汇率表 1 中的比率。本质上,我希望缺失的汇率遵循他们最接近的上一个日期的汇率。

此外,对于 2018 年 4 月 1 日之前的所有日期,汇率应遵循表 1 的 00/00/0000 汇率。

非常感谢您的帮助!非常感谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以使用相关子查询为表 2 中的每个日期查找表 1 中最接近的日期:

    SELECT
        t2.Date,
        t2.USD,
        t2.USD * (SELECT t1.ExchangeRate FROM Table1 t1
                  WHERE t1.Date <= t2.Date
                  ORDER BY DATEDIFF(t2.Date, t1.Date) LIMIT 1) AS ConvertedAmount
    FROM Table2 t2;
    

    Demo

    请注意,这是一种不受控制的方法,因为表 1 中可能有两个最近的日期位于表 2 中日期的两侧,并且可以任意选择一个。确实,这里更好的长期方法是使用日历表,其中仅包含每天的外汇汇率。

    【讨论】:

    • 嗨,蒂姆,非常感谢您的帮助。我刚刚又编辑了我的问题,你能看一下吗?另外,这部分是什么意思“ORDER BY ABS(DATEDIFF(t1.Date, t2.Date)) LIMIT 1”?非常感谢!
    • @Evie 我进行了更改,以便在表 2 中缺少某个日期的情况下使用先前的费率。
    • @Strawberry 我现在又回到了手机上,看到这些边缘情况并不容易。
    • @TimBiegeleisen 。 . .如果问题的格式更易于阅读,更新您的答案会更容易。
    • 非常感谢@TimBiegeleisen 这真的很有帮助
    猜你喜欢
    • 2020-05-07
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多