안녕하세요
제가 view 테이블을 만드려고하는데요
1,2,3 번 테이블이 있고
1,2,3 에는 모두 ID정보가 있습니다.
그리고 2,3번에는 시간 기록이 있는데요
* 2번에만 시간정보가 있을수도 있고
* 3번에만 있을수도 있고
* 2,3 번에 둘다 있을수도 있고
* 2,3 번 둘다 Null 일 수도있습니다.
1번 아이디에 대하여 2,3번중 시간중 가장 최근의 시간을 가져오려면
어떤식으로 접근해야할까요 ㅠㅠ?
결과는
아이디 || 날짜 || 시간
이렇게 출력해야합니다
(( 최근 로그인 이력을 가져오려는 목적입니다 ))
2,3번의 값이 Null이든 시간이든 둘중 가장 최근의 시간을 가져와야하고...
둘다 Null이면 그냥 null로 표현하면 될듯 싶습니다.
도움 부탁드립니다.
Comment 3
-
악마곰
2015.05.26 23:31
-
철스
2015.05.27 11:10
테이블 반환 함수도 가능 합니다.
CREATE FUNCTION [DBO].[UDF_JOB_2](@ID VARCHAR (10))
RETURNS TABLE
AS
RETURN
(
SELECT MAX(A.INSERT_DT) AS INSERT_DT
FROM (
SELECT MAX(INSERT_DT) AS INSERT_DT
FROM JOB.DBO.JOB_TBL_2 WITH (NOLOCK)
WHERE ID = @ID
UNION ALL
SELECT MAX(INSERT_DT) AS INSERT_DT
FROM JOB.DBO.JOB_TBL_3 WITH (NOLOCK)
WHERE ID = @ID
) AS A
);SELECT A.ID, B.INSERT_DT
FROM JOB.DBO.JOB_TBL_1 AS A
CROSS APPLY JOB.DBO.UDF_JOB_2(A.ID) AS B -
향지
2015.05.27 18:15
테이블 1에는 데이터가 무조건 있다는 가정하에
;with table_1 as
(
select 'a' as ID
), table_2 as
(
select 'a' as ID, '2015-01-20' AS login_dt UNION ALL
select 'a' as ID, '2015-01-22' AS login_dt UNION ALL
select 'a' as ID, '2015-01-23' AS login_dt
), table_3 as
(
select 'a' as ID, '2015-01-19' AS login_dt UNION ALL
select 'a' as ID, '2015-01-22' AS login_dt UNION ALL
select 'a' as ID, '2015-01-24' AS login_dt
)
SELECT ID, MAX(Login_Dt) AS Last_Login_Dt
FROM
(
select ID, NULL AS Login_Dt FROM table_1
UNION ALL
select ID, Login_Dt FROM table_2
UNION ALL
select ID, Login_Dt FROM table_3
) AS A
GROUP BY ID
이렇게 UNION ALL로 합쳐서 MAX해도 가능합니다.
졸린 정신으로 답변이 될지.....
간단하게 테이블 변수 이용해봤습니다..
참조 하셔서 활용 해보세요...
아마도 고수님들은 더 쉽게 가능 하실듯...
declare @temp1 table(
id nvarchar(10)
, name nvarchar(30)
)
declare @temp2 table(
id nvarchar(10)
, insert_dt datetime
)
declare @temp3 table(
id nvarchar(10)
, insert_dt datetime
)
insert @temp1
select 'aaa' as id, 'aaa_name' as name union all
select 'bbb' as id, 'bbb_name' as name union all
select 'ccc' as id, 'ccc_name' as name union all
select 'ddd' as id, 'ddd_name' as name union all
select 'eee' as id, 'eee_name' as name
insert @temp2
select 'aaa' as id, '2015-01-01' as insert_dt union all
select 'bbb' as id, null as insert_dt union all
select 'ddd' as id, '2015-01-20' as insert_dt union all
select 'eee' as id, '2015-04-01' as insert_dt union all
select 'aaa' as id, '2015-05-01' as insert_dt union all
select 'eee' as id, '2015-05-10'
insert @temp3
select 'ccc' as id, '2015-01-01' as insert_dt union all
select 'ddd' as id, null as insert_dt union all
select 'ddd' as id, '2015-03-20' as insert_dt
select
a.id, a.name, cc.insert_dt
from @temp1 a
left join (
select bb.id, max(bb.insert_dt) as insert_dt from (
select id, max(insert_dt) as insert_dt from @temp2 group by id union all
select id, max(insert_dt) as insert_dt from @temp3 group by id
) bb
group by bb.id
) cc on a.id = cc.id