繁体   English   中英

查询查找 sql 中的最新记录

[英]Query for finding latest record in sql

给定一个货币表,我需要找到小于给定特定日期的最新转换率记录

输入表结构如下:

ID 基线 电流 速度 日期
1个 印度卢比 美元 81 2022-11-09
2个 印度卢比 美元 82 2022-11-08
3个 印度卢比 美元 80 2022-11-06
4个 印度卢比 计算机辅助设计 56 2022-11-05
5个 印度卢比 .74 2022-11-04
6个 印度卢比 计算机辅助设计 57 2022-11-12

问题陈述:

我需要找到所有小于 2022-11-09 的最新货币汇率。在任何给定日期,只有任何特定货币的汇率

所以预计 output

ID 基线 电流 速度 日期
2个 印度卢比 美元 82 2022-11-08
4个 印度卢比 计算机辅助设计 56 2022-11-05
5个 印度卢比 .74 2022-11-04

output说明:

Id 1,6 被拒绝:因为它们大于 2022-11-09 日期

Id 3 被拒绝,因为我们在第 2 行中还有一条 INR 到 CAD 的记录,而且它的日期对 Id 3 来说更新

如果数据库版本为8.0+ ,则可以使用 window function 等DENSE_RANK()以便使用以下查询确定最新记录

WITH t AS
(
 SELECT t.*, DENSE_RANK() OVER (PARTITION BY baseCur, Curr ORDER BY date DESC) AS dr
   FROM t
  WHERE date < '2022-11-09' 
)
SELECT id, baseCur, Curr, rate, date
  FROM t
 WHERE dr = 1

但是,请注意,如果有的话,此查询也会返回关系(相等的日期值)。

演示

除了为此使用 window function 的选项之外,您还可以使用子查询。 在子查询中,您将捕获具有最新日期的每种货币:

SELECT 
curr, MAX(yourdate) maxDate
FROM yourtable
WHERE yourdate < '2022-11-09' 
GROUP BY curr; 

此查询将产生以下结果:

电流 最大日期
2个 2022-11-08
4个 2022-11-05
5个 2022-11-04

可以通过从主查询应用JOIN子句或IN子句来使用此结果。

这将添加其他列。

SELECT y.id, y.baseCur, y.curr, y.rate, y.yourdate
FROM yourtable y 
JOIN (SELECT 
curr, MAX(yourdate) maxDate
FROM yourtable
WHERE yourdate < '2022-11-09' 
GROUP BY curr) maxDates
ON y.curr = maxDates.curr 
AND y.yourdate = maxDates.maxDate
ORDER BY id;

因此,将创建完整的预期结果:

ID 基线 电流 速度 日期
2个 印度卢比 美元 82 2022-11-08
4个 印度卢比 计算机辅助设计 56 2022-11-05
5个 印度卢比 .74 2022-11-04

要指出这一点:我认为如果可能的话,应该首选使用 window function。

他们只是有“缺点”,旧的数据库不提供它们,而且它们通常因数据库类型而异。

因此,如果需要一个始终适用于每种数据库类型和数据库版本的查询,则这种使用子查询的方式会很有帮助。

您可以使用子查询获取所需的 output,如下所示,它从每种货币获取最新记录。

-- 1. Based on id column
SELECT * FROM sometable as t WHERE t.id = 
(SELECT MAX(id) FROM sometable WHERE Curr = t.Curr and date < '2022-11-09');
-- 2. Based on date column
SELECT * FROM sometable as t WHERE t.date = 
(SELECT MAX(date) FROM sometable WHERE Curr = t.Curr and date < '2022-11-09');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM