要求:剔除第一单实付金额小于100元的订单,再从剩下的订单中找出每个买家第二次以来的复购订单。
是否可以先用客户ID进行排序,再用支付时间排序?还有如何排除第二单出现小于100元的情况呢,求大佬讲解思路
以下是问题中的表
CREATE TABLE T_PAY (pay_tm date, cus_id number(20), ord_no number(20),pay_amt number(10,2));
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-21 08:07:12','YYYY_MM_DD HH24:MI:SS'), 1, 1001, 88.20);
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-21 09:09:19','YYYY_MM_DD HH24:MI:SS'), 2, 1002, 120.40);
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-21 16:09:15','YYYY_MM_DD HH24:MI:SS'), 1, 1003, 167.60);
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-22 18:06:11','YYYY_MM_DD HH24:MI:SS'), 1, 1004, 268.30);
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-23 11:11:12','YYYY_MM_DD HH24:MI:SS'), 3, 1005, 66.60);
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-24 14:16:39','YYYY_MM_DD HH24:MI:SS'), 3, 1006, 88.80);
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-24 17:19:25','YYYY_MM_DD HH24:MI:SS'), 3, 1007, 200.50);
INSERT INTO T_PAY
VALUES (TO_DATE('2020-05-24 20:16:17','YYYY_MM_DD HH24:MI:SS'), 2, 1008, 268.30);
*/
1、所有记录
select * from T_PAY t;
2、查询所有客户第一单,并且金额小于100的订单号
SELECT * --ORD_NO
FROM (SELECT row_number() over(partition by CUS_ID order by pay_tm) RN,
CUS_ID,
PAY_TM,
ORD_NO,
PAY_AMT
FROM T_PAY)
WHERE RN = 1 --第一单填1,第二单填2,如果是第一和第二单填 in (1,2)
AND PAY_AMT < 100 --金额小于100
3、形成结果集:
剔除第一单实付金额小于100元的订单,再从剩下的订单中找出每个买家第二次以来的复购订单
SELECT *
FROM (SELECT row_number() over(partition by CUS_ID order by pay_tm) RN,
CUS_ID,
PAY_TM,
ORD_NO,
PAY_AMT
FROM T_PAY)
WHERE not (RN = 1 AND PAY_AMT < 100)
--这里的not关键字,是取相反条件
欢迎关注,Q群122230156
使用 row_number() over(partition by id order by pay_tm) rowid
生成一个分组的排名,然后根据 rowid 筛选你要的就行。