-1

私はかなり長い間これに困惑してきました。Request#、SlotId、Segment、およびVersionはすべて主キーを構成します。ストアドプロシージャに必要なのは、リクエスト番号とセグメントを渡すことですべての行を取得できるようにすることですが、スロットごとに、今日の日付以前の最新の発効日が必要であり、そこから最高のバージョン番号が必要です。私はあなたの時間を感謝します。

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
4

2 に答える 2

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 ;
于 2012-12-03T22:53:27.057 に答える
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    
于 2012-12-03T23:07:48.247 に答える