连续多日 oracle,连续日期合并问题 - Oracle开发 - ITPUB论坛-中国专业的IT技术社区...

你的语句最外层取END_DATE写的太复杂, 完全可以简化, 下次提问的时候就把需求说清楚, 这样就避免大家猜了

测试代码如下

SQL> with test_data as (

2  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-5-6' as insert_date, 0 as valid_flag from dual

3  union all

4  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-5-10' as insert_date, 0 as valid_flag from dual

5  union all

6  select '0901248' as user_id, 'T000000365' as team_code,  date'2016-5-19' as insert_date, 0 as valid_flag from dual

7  union all

8  select '0901248' as user_id, 'T000000377' as team_code,  date'2016-5-23' as insert_date, 0 as valid_flag from dual

9  union all

10  select '0901248' as user_id, 'T000000383' as team_code,  date'2016-5-26' as insert_date, 0 as valid_flag from dual

11  union all

12  select '0901248' as user_id, 'T000000384' as team_code,  date'2016-5-27' as insert_date, 0 as valid_flag from dual

13  union all

14  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-5-30' as insert_date, 0 as valid_flag from dual

15  union all

16  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-5-31' as insert_date, 0 as valid_flag from dual

17  union all

18  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-6-8'  as insert_date, 0 as valid_flag from dual

19  union all

20  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-6-8'  as insert_date, 0 as valid_flag from dual

21  union all

22  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-6-8'  as insert_date, 0 as valid_flag from dual

23  union all

24  select '0901248' as user_id, 'T000000221' as team_code,  date'2016-6-8'  as insert_date, 0 as valid_flag from dual

25  union all

26  select '9917013' as user_id, 'T000000434' as team_code,  date'2017-3-14' as insert_date, 0 as valid_flag from dual

27  union all

28  select '9917013' as user_id, 'T000000434' as team_code,  date'2017-3-14' as insert_date, 0 as valid_flag from dual

29  union all

30  select '9917013' as user_id, 'T000000453' as team_code,  date'2017-3-22' as insert_date, 0 as valid_flag from dual

31  union all

32  select '9917013' as user_id, 'T000000453' as team_code,  date'2017-3-22' as insert_date, 0 as valid_flag from dual

33  union all

34  select '9917013' as user_id, 'T000000434' as team_code,  date'2017-3-28' as insert_date, 0 as valid_flag from dual

35  union all

36  select '9917013' as user_id, 'T000000434' as team_code,  date'2017-3-28' as insert_date, 0 as valid_flag from dual

37  union all

38  select '9917013' as user_id, 'T000000508' as team_code,  date'2018-3-8' as insert_date, 1 as valid_flag from dual

39  )

40  select  user_id,

41          max(team_code) team_code,

42          min(insert_date) start_date,

43          nvl(lead( min(insert_date)) over(partition by user_id order by min(insert_date)) - 1, decode(max(valid_flag), 0, max(insert_date), 1, trunc(sysdate))) end_date,

44          max(valid_flag) valid_flag

45  from

46  (select user_id,

47          team_code,

48          insert_date,

49          valid_flag,

50          max(rn) over(partition by user_id order by insert_date) rn

51  from

52  (select user_id,

53          team_code,

54          insert_date,

55          valid_flag,

56          case

57           when team_code = lag(team_code) over(partition by user_id order by insert_date) then

58                0

59           else

60                row_number() over(partition by user_id order by insert_date)

61          end rn

62     from test_data))

63  group by user_id, rn

64  order by user_id, min(insert_date);

USER_ID TEAM_CODE  START_DATE  END_DATE    VALID_FLAG

------- ---------- ----------- ----------- ----------

0901248 T000000221 2016/5/6    2016/5/18            0

0901248 T000000365 2016/5/19   2016/5/22            0

0901248 T000000377 2016/5/23   2016/5/25            0

0901248 T000000383 2016/5/26   2016/5/26            0

0901248 T000000384 2016/5/27   2016/5/29            0

0901248 T000000221 2016/5/30   2016/6/8             0

9917013 T000000434 2017/3/14   2017/3/21            0

9917013 T000000453 2017/3/22   2017/3/27            0

9917013 T000000434 2017/3/28   2018/3/7             0

9917013 T000000508 2018/3/8    2018/5/14            1

10 rows selected

SQL>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值