如何在存储过程中通过两次SELECT查询获取最新交易数据
获取符合条件的最新交易记录(SQL查询与存储过程实现)
一、在查询中嵌入子查询
你可以把当前的查询作为子查询嵌套到主逻辑中,满足不同业务需求,示例如下:
方式1:获取最新交易的完整记录
如果需要拿到这条最新交易的所有字段,可通过子查询匹配交易时间实现:
SELECT * FROM TXN.TXN WHERE TransactionDateTime = ( SELECT TOP (1) TransactionDateTime FROM TXN.TXN WHERE TransactionDateTime <= DATEADD(DD, -@DaysSinceLastVisit, GETUTCDATE()) ORDER BY TransactionDateTime DESC )
若存在多条同一时间的交易,上述查询会返回所有同时间记录;若仅需单条,可直接在主查询中排序取TOP:
SELECT TOP (1) * FROM TXN.TXN WHERE TransactionDateTime <= DATEADD(DD, -@DaysSinceLastVisit, GETUTCDATE()) ORDER BY TransactionDateTime DESC
方式2:子查询作为过滤条件
如果要将最新交易时间作为其他逻辑的判断依据,比如筛选该时间之后的数据,直接嵌套即可:
SELECT * FROM TXN.TXN WHERE TransactionDateTime > ( SELECT TOP (1) TransactionDateTime FROM TXN.TXN WHERE TransactionDateTime <= DATEADD(DD, -@DaysSinceLastVisit, GETUTCDATE()) ORDER BY TransactionDateTime DESC )
二、存储过程中通过两次SELECT实现
你可以在存储过程中分两步执行:先查询最新交易时间并存入变量,再用该变量查询目标数据,示例如下:
基础版存储过程
CREATE PROCEDURE GetLatestTransaction @DaysSinceLastVisit INT AS BEGIN SET NOCOUNT ON; -- 第一次查询:获取最新交易时间并赋值给变量 DECLARE @LatestTxnDateTime DATETIME; SELECT TOP (1) @LatestTxnDateTime = TransactionDateTime FROM TXN.TXN WHERE TransactionDateTime <= DATEADD(DD, -@DaysSinceLastVisit, GETUTCDATE()) ORDER BY TransactionDateTime DESC; -- 第二次查询:根据获取到的时间查询完整交易记录 SELECT * FROM TXN.TXN WHERE TransactionDateTime = @LatestTxnDateTime; END
带空值处理的版本
如果需要处理无符合条件交易的情况,可添加判断逻辑:
CREATE PROCEDURE GetLatestTransaction @DaysSinceLastVisit INT AS BEGIN SET NOCOUNT ON; DECLARE @LatestTxnDateTime DATETIME; SELECT TOP (1) @LatestTxnDateTime = TransactionDateTime FROM TXN.TXN WHERE TransactionDateTime <= DATEADD(DD, -@DaysSinceLastVisit, GETUTCDATE()) ORDER BY TransactionDateTime DESC; IF @LatestTxnDateTime IS NOT NULL BEGIN SELECT * FROM TXN.TXN WHERE TransactionDateTime = @LatestTxnDateTime; END ELSE BEGIN SELECT '未找到符合条件的交易记录' AS 提示信息; END END
内容的提问来源于stack exchange,提问作者duckgame
相关产品推荐
相关产品推荐

