0

특정 논리와 결합하려는 두 개의 테이블이 있습니다.MySQL/Hive : 윈도우 또는 분석 함수를 사용하여 조건부 행 결합

된 table_1 (S_No, ID, 날짜 1, 날짜 2)

S_No ID Date1 Date2 
1 id1 2014-05-01 2014-07-03 
2 id1 2015-03-23 2016-06-18 
3 id1 2016-06-21 2016-07-29 

Table_2 (S_No_New, ID_New, Date_New)

S_No_New ID_New Date_New 
2_1 id1 2014-04-25 
2_2 id1 2014-06-14 
2_3 id1 2015-01-10 
2_4 id1 2015-02-15 
2_5 id1 2015-05-17 
2_6 id1 2016-04-24 
2_7 id1 2016-06-19 
2_8 id1 2016-06-25 
2_9 id1 2016-07-11 
2_10 id1 2016-08-11 
2_11 id1 2016-08-16 

내가 얻을 수있는 방법으로 두 테이블 위의 가입하려는 Date1 이전 및 Date1과 Date2 사이에 table_2에 몇 행이 있는지 계산 한 다음 다음 행으로 이동할 때 동일한 ID에 대해 아직까지 계산되지 않은 데이터를 사용해야합니다. 우리가 표 1의 마지막 DATE2 입력 후 table_2의 날짜 항목이있는 경우

는 그리고 우리는 하나가 "S_No와 유사한 남아있는 열 세부에 추가 '로 새 행을 추가 할 필요가있다. 전체

이 문제 두 부분으로 나눌 수 있습니다 : 당신은 해결책을 알고있는 경우
1) 얻기 카운트 열
2) 여분의 행을 추가 (S_No는 "4")이 예에서

는 두 가지 중 하나에 대한 답을 들러주세요

최종 출력 :

S_No ID Date1 Date2 Count_pre Count_Between 
1 id1 2014-05-01 2014-07-03 1 1 
2 id1 2015-03-23 2016-06-18 2 2 
3 id1 2016-06-21 2016-07-29 1 2 
4 id1 NULL NULL 2 0 

로직 :
S_No 1
Count_Pre = 날짜 2014-05-01 및

2014년 7월 3일 사이 2014-05-01
Count_between = 날짜 이전 S_No 2

2015년 3월 23일 및 2016년 6월 18일 사이 Count_between = 날짜

년 7월 3일 및 2015년 3월 23일 사이 Count_Pre = 날짜 0

중간 테이블은 다음과 같이보고 있습니다

S_No ID Date Date2 S_No_New Date_New 
1 id1 2014-05-01 2014-07-03 2_1 2014-04-25 
1 id1 2014-05-01 2014-07-03 2_2 2014-06-14 
2 id1 2015-03-23 2016-06-18 2_3 2015-01-10 
2 id1 2015-03-23 2016-06-18 2_4 2015-02-15 
2 id1 2015-03-23 2016-06-18 2_5 2015-05-17 
2 id1 2015-03-23 2016-06-18 2_6 2016-04-24 
3 id1 2016-06-21 2016-07-29 2_7 2016-06-19 
3 id1 2016-06-21 2016-07-29 2_8 2016-06-25 
3 id1 2016-06-21 2016-07-29 2_9 2016-07-11 
4 id1 NULL NULL 2_10 2016-08-11 
4 id1 NULL NULL 2_11 2016-08-16 

내가 시도 된 다른 윈도우 및 분석 기능을하지만,이 문제를 가져올 수 없습니다. 하이브 (기본 SQL)에서 이러한 종류의 조인을 수행 할 수 있습니까?

참고 : 편집 2 :이 하이브에 구현해야하며 모든 내장 함수를 지원하지만 mysql의 변수는 지원하지 않습니다. 집계, 윈도우 및 분석 기능을 지원합니다.

편집 : YYYY-MM-DD

+0

MySQL의 또는 SQL 서버에 일/월/년에서 날짜 형식을 변경? –

+0

실제로 MySQL입니다. –

+0

1 날짜를 날짜로 저장 – Strawberry

답변

0
SELECT t.t1s_no,t.date1,t.date2, 
     sum(case when t.srce = 'P' then 1 else 0 end) as 'prev', 
     sum(case when t.srce = 'B' then 1 else 0 end) as 'between', 
     sum(case when t.srce = 'X' then 1 else 0 end) as 'missing' 
FROM 
(
SELECT S.*, 
     ROW_NUMBER() OVER (PARTITION BY S.DATE_NEW ORDER BY s.srce ,S.DATE1) RN 
FROM 
(SELECT 'P' AS SRCE,T1.S_NO T1S_NO,T1.ID T1ID,T1.DATE1 DATE1,T1.DATE2 DATE2,T2.DATE_NEW 
FROM TABLE_1 T1 
JOIN TABLE_2 T2 ON T2.DATE_NEW < T1.DATE1 
UNION 
SELECT 'B' AS SRCE,T1.S_NO T1S_NO,T1.ID T1ID,T1.DATE1 DATE1,T1.DATE2 DATE2,T2.DATE_NEW 
FROM TABLE_1 T1 
JOIN TABLE_2 T2 ON T2.DATE_NEW BETWEEN T1.DATE1 AND T1.DATE2 
UNION 
SELECT 'X' AS SRCE,4 T1S_NO,T1.ID T1ID,T1.DATE1 DATE1,T1.DATE2 DATE2,T2.DATE_NEW 
FROM TABLE_2 T2 
left JOIN TABLE_1 T1 ON (T2.DATE_NEW BETWEEN T1.DATE1 AND T1.DATE2) or (t2.date_new < t1.date1) 
where t1.date1 is null 
) S 
) T 
WHERE T.RN = 1 
group by t.t1s_no,t.date1,t.date2 
ORDER BY T.T1S_NO, T.DATE1 
; 

결과

t1s_no  date1   date2   prev  between  missing 
----------- ---------------- ---------------- ----------- ----------- ----------- 
      1  2014-05-01  2014-07-03   1   1   0 
      2  2015-03-23  2016-06-18   2   2   0 
      3  2016-06-21  2016-07-29   1   2   0 
      4    NULL    NULL   0   0   2 

(4 rows affected) 
+0

S_No = 2 인 경우 실제로는 2가되어야합니다. 질문이 업데이트되었습니다. 하이브에서 사용하고 싶었지만 변수를 지원하지 않으면 변수를 사용하지 않고이 작업을 수행 할 수 있습니다. 더 많은 업데이트를 위해 편집을 읽으십시오. –

+0

죄송합니다. 업데이트에 대해 나쁘게 생각합니다. 하이브 구현과 관련하여 먼저 언급 했어야합니다. –

+0

하이브 (hive)를 모르지만 row_number() 함수가있는 것으로 보입니다.이 함수는 제가 사용했던 변수 메소드와 동등 할 수 있습니다. 하이브의 row_number() 함수가 (row_number() by by order by ... order by ...)이 row_number()처럼 보이면 t-sql을 사용하여 내 대답을 업데이트 할 수 있습니다. 네가 그렇게하기를 원한다면 알려줘. –