Oracle SQL - DENSE_RANK

后端 未结 4 1866
抹茶落季
抹茶落季 2021-01-19 18:13

I have a Client data table, selected columns of which are shown below:

Row_ID  Client_ID  Status_ID  From_date           To_date
  1     123456       4               


        
4条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-19 19:17

    Here's a solution using Tabibitosan:

    with client as (select 1 row_id, 123456 client_id, 4 status_id, to_date('20/12/2007 18:02','dd/mm/yyyy hh24:mi') from_date, to_date('20/12/2007 18:07','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 2 row_id, 789087 client_id, 4 status_id, to_date('20/12/2007 18:02','dd/mm/yyyy hh24:mi') from_date, to_date('20/12/2007 18:07','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 3 row_id, 789087 client_id, 4 status_id, to_date('20/12/2007 18:07','dd/mm/yyyy hh24:mi') from_date, to_date('20/12/2007 18:50','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 4 row_id, 789087 client_id, 4 status_id, to_date('20/12/2007 18:50','dd/mm/yyyy hh24:mi') from_date, to_date('21/12/2007 10:38','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 5 row_id, 123456 client_id, 4 status_id, to_date('20/12/2007 18:07','dd/mm/yyyy hh24:mi') from_date, to_date('20/12/2007 18:50','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 6 row_id, 123456 client_id, 4 status_id, to_date('20/12/2007 18:50','dd/mm/yyyy hh24:mi') from_date, to_date('21/12/2007 10:38','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 7 row_id, 123456 client_id, 4 status_id, to_date('21/12/2007 10:38','dd/mm/yyyy hh24:mi') from_date, to_date('21/12/2007 16:39','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 8 row_id, 789087 client_id, 4 status_id, to_date('21/12/2007 10:38','dd/mm/yyyy hh24:mi') from_date, to_date('21/12/2007 17:54','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 9 row_id, 789087 client_id, 4 status_id, to_date('21/12/2007 17:54','dd/mm/yyyy hh24:mi') from_date, to_date('21/12/2007 18:32','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 10 row_id, 789087 client_id, 4 status_id, to_date('21/12/2007 18:32','dd/mm/yyyy hh24:mi') from_date, to_date('22/12/2007 06:48','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 11 row_id, 123456 client_id, 5 status_id, to_date('21/12/2007 16:39','dd/mm/yyyy hh24:mi') from_date, null from dual union all
                    select 12 row_id, 789087 client_id, 5 status_id, to_date('22/12/2007 06:48','dd/mm/yyyy hh24:mi') from_date, to_date('22/12/2007 10:53','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 13 row_id, 789087 client_id, 4 status_id, to_date('22/12/2007 10:53','dd/mm/yyyy hh24:mi') from_date, to_date('22/12/2007 11:51','dd/mm/yyyy hh24:mi') todate from dual union all
                    select 14 row_id, 789087 client_id, 5 status_id, to_date('22/12/2007 11:51','dd/mm/yyyy hh24:mi') from_date, null from dual)
    select row_id,
           client_id,
           status_id,
           from_date,
           todate,
           dense_rank() over (order by client_id, status_id, grp) rank_id
    from   (select row_id,
                   client_id,
                   status_id,
                   from_date,
                   todate,
                   row_number() over (order by client_id, from_date) - row_number() over (partition by status_id order by client_id, from_date) grp -- this is the tabibitosan step
            from   client) t1
    order by client_id, from_date, status_id;
    
        ROW_ID  CLIENT_ID  STATUS_ID FROM_DATE        TODATE              RANK_ID
    ---------- ---------- ---------- ---------------- ---------------- ----------
             1     123456          4 20/12/2007 06:02 20/12/2007 06:07          1
             5     123456          4 20/12/2007 06:07 20/12/2007 06:50          1
             6     123456          4 20/12/2007 06:50 21/12/2007 10:38          1
             7     123456          4 21/12/2007 10:38 21/12/2007 04:39          1
            11     123456          5 21/12/2007 04:39                           2
             2     789087          4 20/12/2007 06:02 20/12/2007 06:07          3
             3     789087          4 20/12/2007 06:07 20/12/2007 06:50          3
             4     789087          4 20/12/2007 06:50 21/12/2007 10:38          3
             8     789087          4 21/12/2007 10:38 21/12/2007 05:54          3
             9     789087          4 21/12/2007 05:54 21/12/2007 06:32          3
            10     789087          4 21/12/2007 06:32 22/12/2007 06:48          3
            12     789087          5 22/12/2007 06:48 22/12/2007 10:53          5
            13     789087          4 22/12/2007 10:53 22/12/2007 11:51          4
            14     789087          5 22/12/2007 11:51                           6
    

提交回复
热议问题