您可以使用LEAD 和ROW_NUMBER 解析函数:
SELECT userid,
productid,
purchasetime,
DeltaPurchaseAmount
FROM (
SELECT userid,
productid,
purchasetime,
productamount
- LEAD( productamount, 1, 0 ) OVER (
PARTITION BY userid, productid
ORDER BY purchasetime DESC
)
AS DeltaPurchaseAmount,
ROW_NUMBER() OVER (
PARTITION BY userid, productid
ORDER BY purchasetime DESC
)
As rn
FROM table_name
)
WHERE rn = 1;
其中,对于 Oracle 中的示例数据:
CREATE TABLE table_name ( userid, productid, purchasetime, productamount ) AS
SELECT 1001, 901, DATE '2021-01-12', 100 FROM DUAL UNION ALL
SELECT 1001, 901, DATE '2021-01-11', 75 FROM DUAL UNION ALL
SELECT 1001, 905, DATE '2021-01-12', 150 FROM DUAL UNION ALL
SELECT 1001, 905, DATE '2021-01-11', 100 FROM DUAL UNION ALL
SELECT 1001, 999, DATE '2021-01-12', 100 FROM DUAL UNION ALL
SELECT 1002, 901, DATE '2021-01-12', 220 FROM DUAL UNION ALL
SELECT 1002, 905, DATE '2021-01-12', 215 FROM DUAL UNION ALL
SELECT 1002, 905, DATE '2021-01-11', 200 FROM DUAL UNION ALL
SELECT 1002, 999, DATE '2021-01-12', 250 FROM DUAL UNION ALL
SELECT 1002, 999, DATE '2021-01-11', 100 FROM DUAL;
(为了简单起见,使用了午夜的日期,但是当时间不是午夜时它仍然有效。)
给予:
用户名 |产品ID |购买时间 |三角洲采购量
-----: | --------: | :----------------- | ------------------:
1001 | 901 | 2021-01-12 00:00:00 | 25
1001 | 905 | 2021-01-12 00:00:00 | 50
1001 | 999 | 2021-01-12 00:00:00 | 100
1002 | 901 | 2021-01-12 00:00:00 | 220
1002 | 905 | 2021-01-12 00:00:00 | 15
1002 | 999 | 2021-01-12 00:00:00 | 150
db小提琴here