Проблема с результатами заказа в DENSE_RANK - PullRequest
1 голос
/ 27 апреля 2011

Я надеюсь, что кто-то может помочь мне с проблемой, с которой я столкнулся при использовании DENSE_RANK в качестве аналитической функции в операторе Oracle SQL. Я знаю, что DENSE_RANK вычисляет ранг каждой строки на основе значений в order_by_clause

DATE        DEP_DT           LOG_NO LEG_NO   CREW                     DR
02/01/2011  02/01/2011 05:45    177 157511995    ANTONI,BARFAR,GARGNI   1
02/01/2011  02/01/2011 08:40    177 157512040    ANTONI,BARFAR,GARGNI   1
02/01/2011  02/01/2011 06:35    179 157556684    GGNCNI,HULBRA,LIFEDA   2
02/01/2011  02/01/2011 09:10    179 157556773    GGNCNI,HULBRA,LIFEDA   2
02/01/2011  02/01/2011 11:40    179 157534059    GGNCNI,HULBRA,LIFEDA   2
02/01/2011  02/01/2011 14:10    179 157533956    GGNCNI,HULBRA,LIFEDA   2
02/01/2011  02/01/2011 17:00    179 157542667    AINGHI,BOIGDE,MORWRE   1
02/01/2011  02/01/2011 19:55    179 157542712    AINGHI,BOIGDE,MORWRE   1

Но поскольку я использую команду для вычисления ранга, ее упорядочение по младшему члену команды в алфавитном порядке, но мне действительно нужно сгруппировать по дате, log_no, команде, а затем упорядочить по dep_dt, как показано ниже:

DATE        DEP_DT           LOG_NO LEG_NO   CREW                     DR
02/01/2011  02/01/2011 05:45    177 157511995    ANTONI,BARFAR,GARGNI   1
02/01/2011  02/01/2011 08:40    177 157512040    ANTONI,BARFAR,GARGNI   1
02/01/2011  02/01/2011 06:35    179 157556684    GGNCNI,HULBRA,LIFEDA   1
02/01/2011  02/01/2011 09:10    179 157556773    GGNCNI,HULBRA,LIFEDA   1
02/01/2011  02/01/2011 11:40    179 157534059    GGNCNI,HULBRA,LIFEDA   1
02/01/2011  02/01/2011 14:10    179 157533956    GGNCNI,HULBRA,LIFEDA   1
02/01/2011  02/01/2011 17:00    179 157542667    AINGHI,BOIGDE,MORWRE   2
02/01/2011  02/01/2011 19:55    179 157542712    AINGHI,BOIGDE,MORWRE   2

 SELECT a.date, a.log_no, a.dep_dt, b.leg_no, b.crew,
 ,DENSE_RANK() OVER (PARTITION BY a.date, a.log_no ORDER BY b.crew) dr
 FROM leg a,
     (
        SELECT 
        leg_no, 
        WM_CONCAT(DISTINCT TRIM(code)) AS crew
        FROM leg_crew
        GROUP BY leg_no 
     ) b
 WHERE a.leg_no = b.leg_no 

Я полагаю, что есть лучший способ сделать это, чем использовать аналитические функции, но я в полном недоумении, поэтому любой совет будет очень признателен !!

Спасибо

1 Ответ

0 голосов
/ 27 апреля 2011

Я думаю, вы могли бы сделать это с дополнительным шагом, подобным этому:

SQL> ALTER SESSION SET nls_date_format='dd/mm/yyyy hh24:mi';

Session altered

SQL> with my_data as (
  2  SELECT to_date('02/01/2011') my_date,  to_date('02/01/2011 05:45') DEP_DT, 177 LOG_NO, 157511995 LEG_NO, 'ANTONI,BARFAR,GARGNI' CREW FROM DUAL
  3  UNION ALL SELECT to_date('02/01/2011'),  to_date('02/01/2011 08:40'), 177, 157512040, 'ANTONI,BARFAR,GARGNI' FROM DUAL
  4  UNION ALL SELECT to_date('02/01/2011'),  to_date('02/01/2011 06:35'), 179, 157556684, 'GGNCNI,HULBRA,LIFEDA' FROM DUAL
  5  UNION ALL SELECT to_date('02/01/2011'),  to_date('02/01/2011 09:10'), 179, 157556773, 'GGNCNI,HULBRA,LIFEDA' FROM DUAL
  6  UNION ALL SELECT to_date('02/01/2011'),  to_date('02/01/2011 11:40'), 179, 157534059, 'GGNCNI,HULBRA,LIFEDA' FROM DUAL
  7  UNION ALL SELECT to_date('02/01/2011'),  to_date('02/01/2011 14:10'), 179, 157533956, 'GGNCNI,HULBRA,LIFEDA' FROM DUAL
  8  UNION ALL SELECT to_date('02/01/2011'),  to_date('02/01/2011 17:00'), 179, 157542667, 'AINGHI,BOIGDE,MORWRE' FROM DUAL
  9  UNION ALL SELECT to_date('02/01/2011'),  to_date('02/01/2011 19:55'), 179, 157542712, 'AINGHI,BOIGDE,MORWRE' FROM DUAL
 10  )
 11  SELECT my_date, dep_dt, log_no, leg_no, crew,
 12         dense_rank() over(PARTITION BY my_date, log_no ORDER BY min_dt, crew) dr
 13    FROM (SELECT d.*,
 14                 MIN(dep_dt) over(PARTITION BY my_date, log_no, crew) min_dt
 15            FROM my_data d);

MY_DATE     DEP_DT          LOG_NO     LEG_NO CREW                         DR
----------- ----------- ---------- ---------- -------------------- ----------
02/01/2011  02/01/2011         177  157512040 ANTONI,BARFAR,GARGNI          1
02/01/2011  02/01/2011         177  157511995 ANTONI,BARFAR,GARGNI          1
02/01/2011  02/01/2011         179  157556684 GGNCNI,HULBRA,LIFEDA          1
02/01/2011  02/01/2011         179  157556773 GGNCNI,HULBRA,LIFEDA          1
02/01/2011  02/01/2011         179  157533956 GGNCNI,HULBRA,LIFEDA          1
02/01/2011  02/01/2011         179  157534059 GGNCNI,HULBRA,LIFEDA          1
02/01/2011  02/01/2011         179  157542667 AINGHI,BOIGDE,MORWRE          2
02/01/2011  02/01/2011         179  157542712 AINGHI,BOIGDE,MORWRE          2

8 rows selected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...