Bạn có thể sử dụng một thủ thuật để liệt kê các giao dịch "tiền mặt". Thủ thuật này là sự khác biệt của số hàng và nó rất hữu ích:
select t.*
from (select t.*, count(*) over (partition by grp, customerid, transtype) as cnt
from (select t.*,
(row_number() over (partition by customerid order by date) -
row_number() over (partition by customerid, transtype order by date)
) as grp
from t
) t
where transtype = 'cash'
) t
where cnt >= 3;
Điều này trả về khách hàng và ngày bắt đầu. Nếu bạn muốn trả lại các giao dịch thực tế, bạn có thể sử dụng một cấp bổ sung của các chức năng cửa sổ:
select customerid, min(date) as start_date, sum(value) as sumvalue
from (select t.*,
(row_number() over (partition by customerid order by date) -
row_number() over (partition by customerid, transtype order by date)
) as grp
from t
) t
where transtype = 'cash'
group by grp, transtype, customerid
having count(*) >= 3;