具有最新数据的复杂 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
我有一个过程可以在给定的一天或一周内 运行 多次。我需要计算已取消订单的折扣金额。
有如下两个表
事务
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