SQL выбрать два одинаковых столбца в одной таблице, но с другим ЗАКАЗОМ - PullRequest
0 голосов
/ 23 февраля 2020

стажер здесь. Мне нужно создать список фамилий из той же таблицы.

скажем, у нас есть таблица с именем "sample", эта таблица состоит только из:

enter image description here

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

enter image description here

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Вот один из способов сделать это. В одном подзапросе присвойте порядковый номер (rn) в порядке возрастания, но также отследите общее количество строк. Затем присоединитесь.

with
  test (last_name, first_name) as (
    select 'L1one'  , 'F1one'    from dual union all
    select 'L2two'  , 'F2two'    from dual union all
    select 'L3three', 'F3hthree' from dual union all
    select 'L4four' , 'F4four'   from dual
   )
, prep (last_name, rn, ct) as (
    select last_name, row_number() over (order by last_name), count(*) over ()
    from   test
  )
select a.last_name as last_name_asc, b.last_name as last_name_desc
from   prep a inner join prep b on a.rn + b.rn = a.ct + 1
;


LAST_NAME_ASC  LAST_NAME_DESC
-------------- --------------
L1one          L4four        
L2two          L3three       
L3three        L2two         
L4four         L1one   
2 голосов
/ 23 февраля 2020

Вот один из вариантов: он разделяет имя и фамилию на два подзапроса, которые используют функцию row_number analyti c. Затем он используется для join строк.

Строки # 1 - 6 представляют данные образца. Запрос, который вам действительно нужен, начинается со строки № 7.

SQL> with test (last_name, first_name) as
  2    (select 'L1one'  , 'F1one'    from dual union all
  3     select 'L2two'  , 'F2two'    from dual union all
  4     select 'L3three', 'F3hthree' from dual union all
  5     select 'L4four' , 'F4four'   from dual
  6    ),
  7  ln as
  8    (select last_name,
  9       row_Number() over (order by last_name) rn
 10     from test
 11    ),
 12  fn as
 13    (select first_name,
 14       row_number() over (order by first_name desc) rn
 15     from test
 16    )
 17  select l.last_name, f.first_name
 18  from ln l join fn f on f.rn = l.rn
 19  order by l.last_name
 20  /

LAST_NA FIRST_NA
------- --------
L1one   F4four
L2two   F3hthree
L3three F2two
L4four  F1one

SQL>

[РЕДАКТИРОВАТЬ: обе фамилии? Я думал, что это опечатка]

Если это так, лучше использовать самостоятельное соединение:

SQL> with test (last_name, first_name) as
  2    (select 'L1one'  , 'F1one'    from dual union all
  3     select 'L2two'  , 'F2two'    from dual union all
  4     select 'L3three', 'F3hthree' from dual union all
  5     select 'L4four' , 'F4four'   from dual
  6    ),
  7  temp as
  8    (select last_name,
  9       row_number() over (order by last_name asc) rna,
 10       row_number() over (order by last_name desc) rnd
 11     from test
 12    )
 13  select a.last_name, d.last_name
 14  from temp a join temp d on a.rna = d.rnd
 15  order by a.last_name;

LAST_NA LAST_NA
------- -------
L1one   L4four
L2two   L3three
L3three L2two
L4four  L1one

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