oracle表查询:要求剔除第一单实付金额小于100元的订单,再从剩下的订单中找出每个买家第二次以来的复购订单

要求:剔除第一单实付金额小于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 筛选你要的就行。