2017-05-11 1 views
0

특정 조건 신청 방법 : 주SQL 서버 - 두 번째 테이블에서 최대 값으로 가입하고 난 두 테이블이

| WeekID | StartDate | 
| 1  | 2016-12-25 | 
| 2  | 2017-01-01 | 
| 3  | 2017-01-08 | 

및 설정 각 WeekID를 들어

| ID | SettingVal | ApplyFrom | 
| 1 | 10   | 2016-06-01 | 
| 2 | 13   | 2017-01-01 | 
| 3 | 5   | 2017-01-02 | 

에게, 내가 선택해야 설정 주 : MAX (ApplyFrom)와 함께, 또한 ApplyFrom < = DATEADD (day, 6, StartDate) 예 :

| WeekID | SettingVal | 
| 1  | 10   | 
| 2  | 5   | 
| 3  | 5   | 
,363,210

나는 다음과 같은 쿼리를 작성하는 경우 : 그것은 두 번째 테이블에서 여러 행과 첫 번째 테이블에서 하나 개의 행을 조인

SELECT t1.WeekID, t2.SettingVal 
FROM Weeks t1 
LEFT OUTER JOIN Settings t2 ON t2.ApplyFrom <= DATEADD(day, 6, t1.StartDate) 

. MAX (ApplyFrom)를 갖는 행과 만 결합하고 필요한 SettingVal 열을 선택하는 방법은 무엇입니까?

답변

2

옵션 1 - TIES

Select Top 1 with ties 
     A.WeekID 
     ,B.SettingVal 
From Weeks A 
Left Join Settings B 
    on B.ApplyFrom<=DateAdd(DAY,6,A.StartDate) 
Order By Row_Number() over (Partition By A.WeekID Order by B.ApplyFrom Desc) 

옵션 WITH 2 - 크로스 적용

Select A.WeekID 
     ,B.SettingVal 
From Weeks A 
Cross Apply (
       Select Top 1 SettingVal 
       From Settings 
       Where ApplyFrom<=DateAdd(DAY,6,A.StartDate) 
       Order By ApplyFrom Desc 
      ) B 

모두 반환

WeekID SettingVal 
1  10 
2  5 
3  5 
+0

안녕하세요, 내 이름은 John입니다. 저는 Stackoverflow 중독자입니다 ... 잠깐만 기다려주십시오 ... 저입니다. – xQbert

+0

감사합니다. 그것은 나를 도울 것입니다. 나는 당신만큼 좋은 SQL이 될 수 있었으면 좋겠다. : D –

+0

@ B.Sverediuk 미소를 지어 줘서 고마워요 :) –

0

당신 이 같은 검색어를 사용하여 시도 할 수 있습니다.

SELECT 
t1.WeekID, 
t2.SettingVal 
FROM Weeks t1 
LEFT OUTER JOIN 
(
SELECT 
    t3.WeekID, 
    MAX(t2.ApplyFrom) ApplyFrom 
FROM Weeks t3 
LEFT OUTER JOIN Settings t2 ON t2.ApplyFrom BETWEEN t3.StartDate AND DATEADD(day, 6, t3.StartDate) 
GROUP BY t3.WeekID 
)T4 
ON T4.WeekID=T1.WeekID 
LEFT OUTER JOIN Settings T2 ON T4.ApplyFrom=T2.ApplyFrom 
+0

사실 t2.ApplyFrom은 t3.StartDate 이전에있을 수 있습니다. 제 예제 처럼요.하지만 여전히 저를 도와 주셔서 감사합니다. –

관련 문제