需求说的不是非常清晰, 如果数据是如下的, 我猜测结果是如下的, 如果我猜的不对, 详细说明
SQL> select * from test1 order by 3, 1;
P_DATE P_ID CLERK_ID SALE_CNT SALE_AMT
----------- ---------- ---------- ---------- ----------
2017/9/11 246784 1 1 4
2017/9/12 246784 1 8 6
2017/9/11 246784 2 1 4
2017/9/12 246784 2 5 9
2017/9/12 246784 3 9 12
2017/9/11 246784 4 1 4
2017/9/12 246784 4 5 7
2017/9/13 246784 4 7 10
2017/9/16 246784 4 9 12
2017/9/18 246784 4 11 15
2017/9/20 246784 4 13 19
2017/9/21 246784 4 17 20
12 rows selected
SQL>
SQL> select p_date "日期",
2 p_id "产品ID",
3 clerk_id "销售员ID",
4 diff_sale_amt "金额差",
5 diff_sale_cnt "销量差"
6 from
7 (select p_date,
8 p_id,
9 clerk_id,
10 sale_cnt,
11 sale_amt,
12 sale_amt - lag(sale_amt, 1, 0) over(partition by clerk_id, flag order by p_date) diff_sale_amt,
13 sale_cnt - lag(sale_cnt, 1, 0) over(partition by clerk_id, flag order by p_date) diff_sale_cnt,
14 row_number() over(partition by clerk_id, flag order by p_date desc) rn
15 from
16 (select p_date,
17 p_id,
18 clerk_id,
19 sale_cnt,
20 sale_amt,
21 max(flag) over(partition by clerk_id order by p_date) flag
22 from
23 (select p_date,
24 p_id,
25 clerk_id,
26 sale_cnt,
27 sale_amt,
28 case
29 when p_date - lag(p_date) over(partition by clerk_id order by p_date) = 1 then
30 0
31 else
32 row_number() over(partition by clerk_id order by p_date)
33 end flag
34 from test1)))
35 where rn<= 1;
日期 产品ID 销售员ID 金额差 销量差
----------- ---------- ---------- ---------- ----------
2017/9/12 246784 1 2 7
2017/9/12 246784 2 5 4
2017/9/12 246784 3 12 9
2017/9/13 246784 4 3 2
2017/9/16 246784 4 12 9
2017/9/18 246784 4 15 11
2017/9/21 246784 4 1 4
7 rows selected
SQL>