Я хочу проверить, повторялось ли значение выше.Как я могу это сделать? - PullRequest
0 голосов
/ 27 сентября 2019

Итак, у меня есть следующий код:

SELECT distinct NVL( l.city, ' '), e.last_name || ' ' || e.first_name
FROM locations l
FULL JOIN departments d
    ON d.location_id = l.location_id
FULL JOIN employees e
    ON e.department_id = d.department_id 

ВЫХОД:

NVL(L.CITY,'')      E.LAST_NAME||''||E.FIRST_NAME                 
------------------- ----------------------------------------------                                                              
1) Seattle                                                                      
2) Seattle             Kochhar Neena                                 
3) Oxford              Zlotkey Eleni                                 
4) Oxford              Abel Ellen                                    
5) Oxford              Vargas Jonathon                                                        
6) Oxford              Grovlin Gus       

Я хочу, чтобы он не отображал строку, где есть только город и нетФамилия, если есть строка, где упоминается этот город.Например, у меня есть строка

Seattle                   Kochhar Neena

, потому что Сиэтл уже отображается, я не хочу видеть первую строку.Однако, если нет строки с городом и фамилией, должна быть строка только с городом.

Есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Используйте row_number аналитическую функцию, основанную на pks.

Select city, ename from 
 (SELECT distinct NVL( l.city, ' ') as city, 
         trim(e.last_name || ' ' || e.first_name) as ename, 
         Row_number()  over 
         (partiotion by l.location_id order by e.department_id desc nulls last) as rn 
   FROM locations l 
        FULL JOIN departments d
    ON d.location_id = l.location_id 
        FULL JOIN employees e
    ON e.department_id = d.department_id) 
 Where case when ename is null and rn != 1
           Then 0 Else 1
           End = 1

Cheers !!

0 голосов
/ 27 сентября 2019

Немного аналитического SQL должен сделать свое дело.

SQL> with your_data as
  2  (
  3  SELECT distinct
  4    l.city city,
  5    e.last_name || ' ' || e.first_name name
  6  FROM hr.locations l FULL JOIN
  7       hr.departments d ON d.location_id = l.location_id FULL JOIN
  8       hr.employees e ON e.department_id = d.department_id
  9  )
 10  select *
 11  from
 12  (
 13  select
 14    y.*,
 15    count(*) over ( partition by city ) as seq
 16  from your_data y
 17  )
 18  where seq = 1 or ( seq > 1 and name != ' ' )
 19  order by 1,2;

CITY                           NAME                                                  SEQ
------------------------------ ---------------------------------------------- ----------
Beijing                                                                                1
Bern                                                                                   1
Bombay                                                                                 1
Geneva                                                                                 1
Hiroshima                                                                              1
London                         Mavris Susan                                            1
Mexico City                                                                            1
Munich                         Baer Hermann                                            1
Oxford                         Abel Ellen                                             34
Oxford                         Ande Sundar                                            34
Oxford                         Banda Amit                                             34
Oxford                         Bates Elizabeth                                        34
Oxford                         Bernstein David                                        34

Полный учебник по этим методам здесь https://www.youtube.com/watch?v=0cjxYMxa1e4&list=PLJMaoEWvHwFIUwMrF4HLnRksF0H8DHGtt

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