查找上一条记录

问题描述 投票:0回答:1

示例代码

DECLARE @tHistory TABLE (PK INT IDENTITY, CustomerID INT, PaidAmount DECIMAL(18, 2), PaidDate DATE)

INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(123, 100.00, '4/1/2024')
INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(321, 500.00, '4/1/2024')
INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(123, 99.00, '5/1/2024')
INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(123, 103.00, '6/1/2024')
INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(321, 95.00, '6/1/2024')
INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(555, 95.00, '6/1/2024')
INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(123, 99.00, '8/1/2024')
INSERT INTO @tHistory(CustomerID, PaidAmount, PaidDate) VALUES(321, 503.00, '10/1/2024')


DECLARE @tReport TABLE (CustomerID INT, CurrentPK INT, PreviousPK INT)
INSERT INTO @tReport (CustomerID, CurrentPK) SELECT CustomerID, PK FROM @tHistory WHERE PaidDate = '6/1/2024'

因此,如果我有此查询,我想找到该客户的上一个条目

结果应该是这个例子中的

  • CustomerID 123 当前 PK 是 4 之前应该是 3
  • CustomerID 321 当前 PK 是 5 之前应该是 2
  • CustomerID 555 当前 PK 为 6 之前应为空

我想事情会是这样的

ORDER BY row_number() OVER (PARTITION BY CustomerID ORDER BY PK DESC)

但我就是找不到合适的组合。

谢谢你

sql sql-server
1个回答
0
投票

LAG() 位置窗口函数允许您返回并从先前的记录中提取值。在这种情况下,它会获取按 PaidDate 排序的具有相同 CustomerID 的先前 PK。

SELECT * FROM
(
SELECT *, LAG(pk) OVER (PARTITION BY CustomerID ORDER BY paiddate) as PreviousPK  FROM @tHistory
) t
WHERE PaidDate = '6/1/2024'

小提琴

PK 客户ID 支付金额 付费日期 上一个PK
4 123 103.00 2024-06-01 3
5 321 95.00 2024-06-01 2
6 555 95.00 2024-06-01
© www.soinside.com 2019 - 2024. All rights reserved.