оракул sql как выбрать первый ряд и последний ряд выбрать два - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть два выбора. Первый -

select usuario,fecha from (
select mam.fecha fecha , u.COD_USUARIO usuario
from r_mod_asignar_material mam ,
r_usuarios u
where  mam.cod_usuario = u.cod_usuario
and u.ID_CENTRO_GESTION = '1'
and trunc(mam.FECHA) = to_date('13/09/2018','dd/mm/yyyy')
and mam.ACCION = 'A'

order by mam.fecha asc ) 
where rownum = 1) a

Этот выбор возвращает fecha и usuario.

Теперь у меня есть другой выбор, такой же, но меняющий местоположение.

select usuario,fecha from (
select mam.fecha fecha , u.COD_USUARIO usuario
from r_mod_asignar_material mam ,
r_usuarios u
where  mam.cod_usuario = u.cod_usuario
and u.ID_CENTRO_GESTION = '1'
and trunc(mam.FECHA) = to_date('13/09/2018','dd/mm/yyyy')
and mam.ACCION = 'A'

order by mam.fecha desc ) b1
where rownum = 1

) b

Я хочу вернуть fecha и usuario из первого и второго вариантов, где обычно используется одинаковое значение.

Я пытаюсь использовать встроенное выделение, но значение, возвращаемое первым выбором, не совпадает с возвращаемым вторым выбором

select a.fecha fecha1, a.usuario usuario1 ,b.fecha fecha2,b.usuario usuario2
from (
select usuario,fecha from (
select mam.fecha fecha , u.COD_USUARIO usuario
from r_mod_asignar_material mam ,
r_usuarios u
where  mam.cod_usuario = u.cod_usuario
and u.ID_CENTRO_GESTION = '1'
and trunc(mam.FECHA) = to_date('13/09/2018','dd/mm/yyyy')
and mam.ACCION = 'A'

order by mam.fecha asc ) 
where rownum = 1) a
join
(select usuario,fecha from (
select mam.fecha fecha , u.COD_USUARIO usuario
from r_mod_asignar_material mam ,
r_usuarios u
where  mam.cod_usuario = u.cod_usuario
and u.ID_CENTRO_GESTION = '1'
and trunc(mam.FECHA) = to_date('13/09/2018','dd/mm/yyyy')
and mam.ACCION = 'A'

order by mam.fecha desc ) b1
where rownum = 1

) b
on a.usuario = b.usuario

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Вы можете использовать Oracle KEEP FIRST/LAST:

select
  min(mam.fecha) as primera_hora,
  min(u.cod_usuario) keep (dense_rank first mam.fecha) as primero_usuario,
  max(mam.fecha) as ultima_hora,
  max(u.cod_usuario) keep (dense_rank last mam.fecha) as ultimo_usuario
from r_mod_asignar_material mam
join r_usuarios u on u.cod_usuario = mam.cod_usuario and u.id_centro_gestion = 1
where trunc(mam.fecha) = date '2018-09-13'
and mam.accion = 'A';
0 голосов
/ 14 сентября 2018

используйте объединение между ними, это будет работать:

select usuario,fecha from (
select mam.fecha fecha , u.COD_USUARIO usuario
from r_mod_asignar_material mam ,
r_usuarios u
where  mam.cod_usuario = u.cod_usuario
and u.ID_CENTRO_GESTION = '1'
and trunc(mam.FECHA) = to_date('13/09/2018','dd/mm/yyyy')
and mam.ACCION = 'A'
order by mam.fecha asc ) 
where rownum = 1) a
union all
select usuario,fecha from (
select mam.fecha fecha , u.COD_USUARIO usuario
from r_mod_asignar_material mam ,
r_usuarios u
where  mam.cod_usuario = u.cod_usuario
and u.ID_CENTRO_GESTION = '1'
and trunc(mam.FECHA) = to_date('13/09/2018','dd/mm/yyyy')
and mam.ACCION = 'A'

order by mam.fecha desc ) b1
where rownum = 1;
0 голосов
/ 14 сентября 2018

Можете ли вы использовать row_number () вместо этого, возможно:

SELECT
    usuario
  , fecha
FROM (
    SELECT
        mam.fecha                                                              fecha
      , u.COD_USUARIO                                                          usuario
      , ROW_NUMBER() OVER (PARTITION BY u.cod_usuario ORDER BY mam.fecha ASC)  AS rn_asc
      , ROW_NUMBER() OVER (PARTITION BY u.cod_usuario ORDER BY mam.fecha DESC) AS rn_desc
    FROM r_mod_asignar_material mam
    INNER JOIN r_usuarios u ON mam.cod_usuario = u.cod_usuario
    WHERE u.ID_CENTRO_GESTION = '1'
    AND trunc(mam.FECHA) = to_date('13/09/2018', 'dd/mm/yyyy')
    AND mam.ACCION = 'A'
    ) b1
WHERE (rn_asc = 1 OR rn_desc = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...