Mysql
通過執行聚合對行進行分組
我有一組可以是付款或購買的交易。購買可以是不同的類型(例如“ApplePurchase”、“OrangePurchase”)。
我將通過他們的優惠券程式碼選擇一些付款。對於每次付款,我希望放棄所有購買,直到最後一次,在該付款之前,餘額達到零。然後我希望匯總剩餘的購買。(感謝@Andriy M 的措辭和對屠殺牠的道歉)。
任何關於如何在 SQL 中編寫(部分)解決方案的建議或將不勝感激。
以下是一些範例數據:
create table users (id integer primary key); create table transactions (user_id integer references users (id), type enum('ApplePurchase', 'OrangePurchase', 'Payment'), coupon varchar(10), date_paid date, amount integer); insert into users (id) values (1), (2), (3), (4), (5); insert into transactions (user_id, type, coupon, date_paid, amount) values (1, 'ApplePurchase', NULL, '2003-01-02', 5), (2, 'ApplePurchase', NULL, '2003-01-02', 15), (1, 'Payment', 'aCoupon', '2003-01-02', 5), # here user 1's balance reaches 0 (2, 'OrangePurchase', NULL, '2003-01-03', 10), (2, 'Payment', 'bCoupon', '2003-01-03', 23), (1, 'ApplePurchase', NULL, '2003-01-05', 15), (1, 'Payment', 'bCoupon', '2003-01-05', 15), (1, 'ApplePurchase', NULL, '2003-01-07', 15), (1, 'Payment', 'bCoupon', '2003-01-07', 15);
也許我希望為優惠券“bCoupon”的付款執行此聚合。會員 2 有一次該類型的付款和 3 次購買。由於沒有乾預付款,我們只需要匯總購買(如第一行所示)。成員二有兩次這種類型的付款。第一個之前有兩次購買,但第一次購買被較早的付款取消。在這種情況下,我正在尋找表格的結果
Date | Member | Apple | Orange | Payment | Balance 2003-03-01 | 2 | 15 | 10 | 23 | 2 2003-05-01 | 1 | 15 | 0 | 15 | 0 2003-07-01 | 1 | 15 | 0 | 15 | 0
一種選擇是將其中一些功能留給應用程式碼。可以通過以下方式查詢相關數據
select * from transactions t where exists( select 1 from transactions t2 where t2.coupon = 'bCoupon' and t.user_id = t2.user_id and t2.date_paid > t.date_paid ) order by date_paid
然後把它折疊起來。