PostgreSQL 查询货币兑换率

问题描述 投票:0回答:2

让我们考虑货币换算的数据库表如下所示:

来自货币 换算货币 生效日期 转化率
美元 印度卢比 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 查询来获取记录。

java sql postgresql jooq
2个回答
0
投票

尝试以下 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 的可配置性,您可能需要根据需要更改它们(即取货系统日期)。

我的小提琴可以玩这个。


0
投票

在 jOOQ 和原生 PostgreSQL 中,都可以使用

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();
© www.soinside.com 2019 - 2024. All rights reserved.