2012-12-03 39 views
-1

我已經在這一段時間陷入了一段時間。請求#,SlotId,Segment和Version全部組成主鍵。我希望從我的存儲過程中能夠通過傳遞請求#和Segment檢索所有行,但是對於每個插槽,我希望最近的生效日期在今天或之前,因此我需要最高版本#。我感謝你的時間。按最新日期和最高版本選擇所有列

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 

值我想從我的存儲過程返回時,當我傳遞A123請求#和A段。

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