[英]oracle sql how to select first row and last row two select
我有两个选择。 第一个是
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,其中 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
你可以改用 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)
您可以使用 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';
在它们之间使用 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 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.