具有最新数据的复杂 Sql Select 语句

Complex Sql Select statement with latest data

我有一个过程可以在给定的一天或一周内 运行 多次。我需要计算已取消订单的折扣金额。

有如下两个表

事务

TransactionId,   Date,       Type,    OriginalId
1                2015-1-1    Order    
2                2015-1-1    Order 
3                2015-1-1    Order  
4                2015-1-2    Return   2
5                2015-1-2    Order

DiscountTransactions - 保存在给定 运行 时间给予折扣的所有交易的记录。

RunId,  TransactionId,   DiscountPercent, Date 
1       1                20%              2015-1-1
1       2                20%              2015-1-1
1       3                20%              2015-1-1
(running program second time, however different discount was applied)
2       1                45%              2015-1-1
2       2                45%              2015-1-1
2       3                45%              2015-1-1
(running program third time, for 2015-1-2)
3       4                45%              2015-1-2
3       5                45%              2015-1-2

在 运行 程序运行 3 次后(2015-1-1 两次,2015-1-2 一次)我需要计算给定 TransactionId 的 ORIGINALID 的折扣百分比 %

因此,TransactionId 4 是 OriginalId = 1 的取消调用。因此在 select 语句中,我想获得该原始 ID 的最新有效折扣百分比。

select 语句的输入应该是日期。例如,输入 2015-1-2 将 return 包含一条记录的结果:

TransactionId, OriginalId, Discount%
4              2           45% (45% and NOT 20%) - because it's the latest discount percent given for Transactionid = 1)

您可以在 DiscountTransactions.TransactionId = Transactions.OriginalId 上执行 JOIN 并使用 ROW_NUMBER() 获取最新的 DiscountPercent:

;WITH Cte AS(
    SELECT
        t.*,
        dt.DiscountPercent,
        RN = ROW_NUMBER() OVER(ORDER BY dt.Date DESC, RunId DESC)
    FROM Transactions t
    LEFT JOIN DiscountTransactions dt
        ON dt.TransactionId = t.OriginalId
    WHERE
        t.Date = CAST('20150102' AS DATE)
        AND t.Type = 'Return'
)
SELECT
    TransactionId,
    OriginalId,
    DiscountPercent
FROM Cte
WHERE RN = 1