2016-09-17 2 views
-3

이 두 테이블을 조인 할 때 두 행만 검색하려고합니다. 테이블 A에서SELECT 문에서 일치 또는 최상위 행 반환

: 나는 테이블 B의 ID 및 날짜

이 : 나는 ID와 타임 스탬프가 있습니다.

My select는 4 개의 행을 검색하지만 테이블 A (조건 1)의 날짜와 일치하는 테이블 B의 타임 스탬프를 선택하려고합니다. 두 개의 날짜가 발견되면 (조건 2) 가장 최근의 시간 소인이있는 날짜를 선택하려고합니다. 여기

모델입니다 :

SELECT A.ID, B.TIMESTAMP FROM A, B 
WHERE A.ID = B.ID 

표 A

ID   || Date 
1   || 09/17/2016 
2   || 02/02/2016 

표 B

ID||TIMESTAMP 
1 || 17-SEP-16 12.50.40.754543000 PM 
1 || 19-SEP-16 12.56.40.754543000 PM 
2 || 02-FEB-08 10.31.36.154000000 PM 
2 || 02-FEB-08 10.31.32.284000000 PM 

결과

ID || TIMESTAMP 
1 || 17-SEP-16 12.50.40.754543000 PM 
2 || 02-FEB-08 10.31.36.154000000 PM 
+0

올바른 JOIN을 사용하는 법을 배웁니다. FROM 문에 쉼표를 입력해야 할 필요성을 느끼면 잘못된 신호를 보내고있는 것입니다. –

+0

JOIN을 사용하는 경우에도 select는 여전히 2 개의 행을 반환하지만 비교에서는 하나만 반환해야합니다. A. B. = A.ID = B.ID –

+0

질문을 선택하고 샘플 데이터를 추가하고 해당 데이터를 기반으로 예상되는 출력을 추가하십시오. [_Formatted_] (http://stackoverflow.com/editing-help#code) ** text ** please, [스크린 샷 없음] (http : //meta.stackoverflow.co.kr/questions/285551/왜 코드 업로드시 이미지가 필요하지 않을지/285557 # 285557) –

답변

0
0 당신은 같은 ID에서 가장 오래된 날짜 - 시간을 찾고있다처럼
+0

감사합니다. MAX를 선택하고 싶다면이 기능이 제대로 작동합니다. 그러나이 경우 A.DATE = B.TIMESTAMP가 먼저 일치하는지 확인하려면 일치 항목이 하나있는 경우이를 선택합니다. 그러나 둘 이상의 일치 항목이있는 경우 가장 많이 일치하는 항목을 선택하십시오. 최근의 타임 스탬프. 미리 감사드립니다. –

0

이 시도는

CREATE TABLE TABLE1 
(
ID Int, 
Date Date 
) 

CREATE TABLE TABLE2 
(
ID int, 
Timestamp Datetime 
) 

INSERT INTO TABLE1 VALUES(1,'09/17/2001') 
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:10:12.013') 
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:15:15.015') 
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:18:15.015') 
INSERT INTO TABLE2 VALUES(1,'09/17/2001 12:25:15.015') 

SELECT * FROM TABLE1 
SELECT * FROM TABLE2 

SELECT A.ID, C.Timestamp 
    FROM TABLE1 AS A 
CROSS APPLY (SELECT MAX(B.Timestamp) AS Timestamp 
       FROM TABLE2 AS B 
       WHERE A.ID = B.ID) AS C 
+0

감사합니다. 귀하의 질의는 두 경우 모두 MAX 타임 스탬프를 선택합니다. 초기 게시물에서 표 샘플 이미지를 업데이트했습니다. 고맙습니다. –

0

보인다. 아래 예제를 시도해 볼 수 있습니다.

SELECT A.ID, MIN(B.TIMESTAMP) AS TIMESTAMP FROM A INNER JOIN B ON A.ID = B.ID GROUP BY A.ID 
+0

쿼리는 두 ID에 대해 MIN을 선택합니다. 나는 ID 1과 MAX 2에 대한 정확한 일치를 찾기를 바랐다. 나는 초기 게시물에 표 예제 스크린 샷을 올렸다. 고맙습니다. –

+0

ID 1의 정확한 일치와 ID 2의 MAX는 무엇을 의미합니까? * 여러 행이 있으면 ID 3, 4 일 수 있습니다. ?? – Ravi

+0

예를 들어, ID 1의 경우 쿼리는 일치하는 타임 스탬프를 먼저 찾은 다음 일치하는 타임 스탬프를 찾은 다음 해당 타임 스탬프를 선택해야합니다. 쿼리가 두 개의 일치하는 타임 스탬프를 찾으면 가장 최근의 타임 스탬프를 선택합니다. 초기 게시 이미지에 결과 세트의 예를 넣었습니다. thanks –

0

확인이 쿼리,

SELECT A.ID, A.Date, C.ID , CONVERT(VARCHAR,C.Timestamp,100) AS Timestam 
    FROM TABLE1 AS A 
CROSS APPLY (SELECT ID,MAX(B.Timestamp) AS Timestamp 
       FROM TABLE2 AS B 
       WHERE A.ID = B.ID GROUP BY ID) AS C 
+0

쿼리가 두 ID에 대해 여전히 MAX 타임 스탬프를 선택합니다. ID : 1의 경우 스탬프로 17-SEP-16 12.50.40.754543000 PM을 선택하고 ID : 2, 02-FEB-08 10.31.36.154000000 PM을 선택해야합니다. 초기 게시물에 업데이트 된 테이블 예제를 게시했습니다. 감사합니다 –

+0

오라클에는'convert()'가 없습니다 (왜 타임 스탬프를 변환해야하는지 알지 못합니다) –

0

당신은 두 단계에서이 작업을 수행해야합니다. 먼저 타임 스탬프의 날짜 구성 요소가 테이블 A의 날짜와 일치한다는 조건에 참여해야합니다. 실제 상황에서도 가능한 경우 테이블 B에 일치하는 타임 스탬프가없는 경우 어떤 일이 발생할지 말하지 않았습니다 데이터. 아래의 솔루션에서는 테이블 A의 행이 결과 집합에 전혀 나타나지 않기를 바란다고 가정합니다. 귀하의 요구 사항이 다르다면 그렇게 말하면 아마도 해결책이 적용될 수 있습니다.

그런 다음 ID별로 그룹화하고 최대 타임 스탬프를 선택해야합니다. 아래의 솔루션에서 ID는 테이블 A의 고유 한 키라고 가정합니다. 대신 테이블 A에있는 동일한 ID를 가진 여러 행을 다른 날짜와 함께 사용할 수 있다면 전체 요구 사항에 따라 솔루션을 수정해야합니다. 대부분 DATE를 GROUP BY 절에 추가해야합니다.

날짜는 순수한 날짜 (시간 구성 요소가 00:00:00 임)로 가정합니다.

참고 : "timestamp"및 "date"를 열 이름으로 사용하지 않았습니다. 예약 키워드이므로 열 이름으로 사용하면 안됩니다. 대신 ts와 dt를 사용했습니다.

select a.id, max(b.ts) as ts 
from  a inner join b 
     on a.id = b.id and b.ts >= a.dt and b.ts < a.dt + 1 
group by a.id 
;