2012-12-03 5 views
-1

나는 꽤 오랫동안 이것을 곤두박질 쳤습니다. Request #, SlotId, Segment 및 Version은 모두 기본 키를 구성합니다. 내가 원하는 건 내 저장된 proc에서 Request # and Segment를 전달하여 모든 행을 검색 할 수 있지만 각 슬롯마다 현재 날짜 또는 그 이전에 가장 최근의 유효한 날짜를 원한다. 나는 너의 시간을 appriciate.전체 열 선택 최근 날짜 및 가장 높은 버전으로

Values in database 
Request# SlotId Segment Version Effective Date ContentId 
A123  1  A  1   2012-01-01  1 
A123  2  A  1   2012-01-01  2 
A123  2  A  2   2012-02-01  34 
A123  2  A  3   2012-02-01  24 
A123  2  A  4   2015-01-01  6 //beyond todays date. dont want 

값 난 내가 세그먼트 요청 번호와 A의 A123에 통과 할 때 내 저장된 프로 시저에서 반환 할.

A123  1  A  1   2012-01-01  1 
A123  2  A  3   2012-02-01  24 

답변

1

쿼리는 다음처럼 쓸 수있다

; WITH cte AS 
    (SELECT Request, SlotId, Segment, Version, [Effective Date], ContentId, 
      ROW_NUMBER() OVER (PARTITION BY Request, Segment, SlotId 
           ORDER BY Version DESC) AS RowN 
     FROM 
      tableX 
     WHERE 
      Request = @Req AND Segment = @Seg    --- the 2 parameters 
     AND [Effective Date] < DATEADD(day, 1, GETDATE()) 
    ) 
    SELECT Request, SlotId, Segment, Version, [Effective Date], ContentId 
    FROM cte 
    WHERE Rn = 1 ; 
0

이를 고려

; 
WITH A as 
(
    SELECT DISTINCT 
     Request 
    , Segment 
    , SlotId 
    FROM Table1 
) 
SELECT A.Request 
, A.SlotId 
, A.Segment 
, B.EffectiveDate 
, B.Version 
, B.ContentID 
    FROM A 
    JOIN (
     SELECT Top 1 
      Request 
     , SlotId 
     , Segment 
     , EffectiveDate 
     , Version 
     , ContentId 
     FROM Table1 t1 
     WHERE t1.Request = A.Request 
      AND t1.SlotId = A.SlotId 
      AND T1.Segment = A.Segment 
      AND T1.EffectiveDate <= GetDate() 
     ORDER BY 
      T1.EffectiveDate DESC 
     , T1.Version DESC 
    ) as B 
     ON A.Request = B.Request 
     AND A.SlotId = B.SlotId 
     AND A.Segment = B.Segment  
관련 문제