根据避免两个不同表的部分,有没有办法将其组合到一个查询中以获得结果?在历史表中,相对于货币‘USD’有USD多行,我只需要移动到历史记录中的最后一个值就可以挑选出来

Select  M.CR CR, M.Rate RATE, M.Operator OPERATOR
From Rate M
Where M.CR = 'USD' 


Select M.CR CR, M.Rate RATE, M.Operator OPERATOR
    , max(M.FROMSOURCEDATE) As MovedDate
From RateHistory M
Where M.CR = 'USD' 
Group by M.CR, M.Rate, M.Operator

这里只有FROMSOURCEDATE是我唯一可以用日期更新的字段,当它移动到历史表中时.

当前结果是

CR RATE OPERATOR
USD 3.65 *
CR RATE OPERATOR MOVEDDATE
USD 3.75 * 2023-10-29 22:57:22.820
USD 3.73 * 2023-10-29 22:56:22.810
USD 3.67 * 2023-10-29 22:56:21.820
USD 3.77 * 2023-10-29 22:57:22.803
USD 3.55 * 2023-9-29 21:57:22.820
USD 3.45 * 2023-9-29 21:56:22.810
USD 3.71 * 2023-8-29 20:55:25.505
USD 3.75 * 2023-8-29 20:55:25.410
USD 3.66 * 2023-7-29 22:57:22.820
USD 3.68 * 2023-7-29 22:57:22.820
USD 3.75 * 2023-7-29 22:57:22.820

所需结果如下所示

CR NEWRATE OLDRATE OPERATOR
USD 3.65 3.75 *

推荐答案

您可以在外部应用中使用TOP 1来仅获取基于最新FROMSOURCEDATE的最新历史汇率

CREATE TABLE Rate (
    CR NVARCHAR(50),
    Rate DECIMAL(10, 2),
    Operator NVARCHAR(50)
);

CREATE TABLE RateHistory (
    CR NVARCHAR(50),
    Rate DECIMAL(10, 2),
    Operator NVARCHAR(50),
    FROMSOURCEDATE DATETIME
);
INSERT INTO Rate (CR, Rate, Operator)
VALUES
('USD', 3.65, '*');

INSERT INTO RateHistory (CR, Rate, Operator, FROMSOURCEDATE)
VALUES
('USD', 3.60, '*', '2023-10-27T22:57:22.820'),
('USD', 3.75, '*', '2023-10-29T22:57:22.820'),
('USD', 3.70, '*', '2023-10-28T22:57:22.820');
SELECT
    r.CR,
    r.Rate AS NEWRATE,
    rh.Rate AS OLDRATE,
    r.Operator
FROM
    Rate r
OUTER APPLY (
    SELECT TOP 1 Rate
    FROM RateHistory
    WHERE CR = r.CR
    ORDER BY FROMSOURCEDATE DESC
) rh
WHERE r.CR = 'USD';
CR NEWRATE OLDRATE Operator
USD 3.65 3.75 *

fiddle

Sql相关问答推荐

Oracle SQL中的累计总数

对任何(数组)使用LIKE?

在SQL中返回缺省值,即使查询不返回任何结果

查询页面推荐

如何用客户名称计算sum(dr)和sum(cr)

使用与JOIN一起使用的查询后进行分页和排序

在 PostgreSQL 中使用 ltree 列进行累积

替换SQL Server XML中多处出现的 node 值

对于小数据集,EF / SQL 语句花费的时间太长

使用长 IN 子句的 SQL 优化

SQL 将 Varchar 转换为日期

BigQuery导航函数计算ID

如何通过CROSS APPLY获取多级嵌套JSON属性的值?

在 SQL 查询中创建滚动日期

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

Athena:从字符串birth_dt列计算年龄

每组跨行曲折?

从多个连接返回 1 行到同一个表 - SQL Server

使用同一表中的数据或任何其他虚拟数据在 SQL 表中插入数据的最快方法