Mysql

通過執行聚合對行進行分組

  • February 26, 2016

我有一組可以是付款或購買的交易。購買可以是不同的類型(例如“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

然後把它折疊起來。

引用自:https://dba.stackexchange.com/questions/130334