让我们考虑货币换算的数据库表如下所示:
来自货币 | 换算货币 | 生效日期 | 转化率 |
---|---|---|---|
美元 | 印度卢比 | 2024 年 3 月 1 日 | 80 |
美元 | 印度卢比 | 2024 年 1 月 1 日 | 85 |
美元 | 英镑 | 2023 年 10 月 1 日 | .80 |
美元 | 英镑 | 2024 年 3 月 1 日 | .85 |
美元 | 澳元 | 2023 年 3 月 1 日 | 1.55 |
美元 | 澳元 | 2024 年 3 月 1 日 | 1.60 |
如果在 2024 年 2 月 1 日查询数据库,要获取 fromCurrency='USD' 的兑换率,应该返回
来自货币 | 换算货币 | 生效日期 | 转化率 |
---|---|---|---|
美元 | 印度卢比 | 2024 年 1 月 1 日 | 85 |
美元 | 英镑 | 2023 年 10 月 1 日 | .80 |
美元 | 澳元 | 2023 年 3 月 1 日 | 1.55 |
2024 年 4 月 15 日的相同查询应该返回
来自货币 | 换算货币 | 生效日期 | 转化率 |
---|---|---|---|
美元 | 印度卢比 | 2024 年 3 月 1 日 | 80 |
美元 | 英镑 | 2024 年 3 月 1 日 | .85 |
美元 | 澳元 | 2024 年 3 月 1 日 | 1.60 |
基本上,对于(fromCurrency,toCurrency)的所有可能组合,数据库中有许多记录,并且在查询数据库时的特定日期,根据有效日期,只有这些记录中的一条适用。我正在尝试找出最好的 postgres 查询来获取记录。
尝试以下 PostgreSQL 查询,根据查询日期(或取货系统日期)获取适用的兑换率:
SELECT
from_currency,
to_currency,
MAX(effective_date) FILTER (WHERE effective_date <= '2023-12-05') AS effective_date,
MAX(conversion_rate) FILTER (WHERE effective_date <= '2023-12-05') AS conversion_rate
FROM conversion_rates
WHERE from_currency = 'USD'
GROUP BY from_currency, to_currency
ORDER BY from_currency, to_currency;
我保留了 effective_date 和 from_currency 的可配置性,您可能需要根据需要更改它们(即取货系统日期)。
我的小提琴可以玩这个。
DISTINCT ON
:
使用 SQL:
SELECT DISTINCT ON (fromCurrency, toCurrency)
fromCurrency, toCurrency, effectiveDate, conversionRate
FROM conversions
WHERE effectiveDate >= :currentDate
ORDER BY fromCurrency, toCurrency, effectiveDate DESC
与jOOQ:
var c = CONVERSIONS.as("c");
ctx.select(c.FROM_CURRENCY, c.TO_CURRENCY, c.EFFECTIVE_DATE, c.CONVERSION_RATE)
.distinctOn(c.FROM_CURRENCY, c.TO_CURRENCY)
.from(c);
.where(c.EFFECTIVE_DATE.ge(currentDate))
.orderBy(c.FROM_CURRENCY, c.TO_CURRENCY, c.EFFECTIVE_DATE.desc())
.fetch();