首页 > 解决方案 > oracle sql如何选择第一行和最后一行两个选择

问题描述

我有两个选择。第一个是

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

我想从 usuario 相同的第一个和第二个选择返回 fecha 和 usuario。

我尝试内联选择,但第一个选择返回的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

标签: sqloracle

解决方案


您可以改用 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)

推荐阅读