示例代码
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'
因此,如果我有此查询,我想找到该客户的上一个条目
结果应该是这个例子中的
我想事情会是这样的
ORDER BY row_number() OVER (PARTITION BY CustomerID ORDER BY PK DESC)
但我就是找不到合适的组合。
谢谢你
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 | 空 |