1

次のような[ProductPriceHistory]という名前のテーブルがあるとします。

HistoryID..ProductCode..EffectDate....価格....IsActive... ProductName
1 ---------- 11 -----------1 Jan 09 ------- 100 ------- true ------- AAA
2----------11 -----------1 Feb 09 ------- 150 ------- true ------- AAA
3----------11 -----------1 Mar 09 ------- 200 ------- false ------ AAA
4----------22 -----------1 Jan 09 ------- 150 ------- true ------- BBB
5----------22 -----------1 Feb 09 ------- 200 ------- true ------- BBB
6 ---------- 22 -----------1 Mr 09 -------- 250 ------- true ------- AAA

最新の日付ですべてのアクティブな製品の最終ステータスを確認するにはどうすればよいですか?

つまり、私のクエリは次の行を見つけます。

6 ---------- 22 -----------1 Mr 09 -------- 250 ------- true ------- AAA
4

4 に答える 4

2
select * from ProductPriceHistory p1
where EffectDate = 
(select max(EffectDate) from ProductPriceHistory p2
where p1.ProductCode = p2.ProductCode and p2.EffectDate<=getdate())
于 2009-06-09T15:49:55.867 に答える
1

完全に指定しているわけではありません。おそらく@tekBluesのクエリが必要なものであるか、または次のようになります。

SELECT * FROM ProductPriceHistory t1
WHERE t1.EffectDate =
  (SELECT MAX(t2.EffectDate)
   FROM ProductPriceHistory t2
   WHERE t2.IsActive=true)
  AND t1.IsActive=true
于 2009-06-09T15:51:34.803 に答える
1

指定された製品コードの値を取得するには、次のようにします。

DECLARE @ProcuctCode  int
SET @ProductCode=11

SELECT
    h.* 
    FROM ProductPriceHistory h
        INNER JOIN (SELECT
                        ProductCode
                            ,MAX(EffectDate) AS MaxEffectDate
                        FROM ProductPriceHistory
                        WHERE ProductCode=@ProductCode
                            AND IsActive='true'
                        GROUP BY ProductCode
                   ) dt ON h.ProductCode=dt.ProductCode AND h.EffectDate=dt.MaxEffectDate
    WHERE h.ProductCode =@ProductCode

すべての製品の使用を見つけるには:

SELECT
    h.* 
    FROM ProductPriceHistory h
        INNER JOIN (SELECT
                        ProductCode
                            ,MAX(EffectDate) AS MaxEffectDate
                        FROM ProductPriceHistory
                        WHERE IsActive='true'
                        GROUP BY ProductCode
                   ) dt ON h.ProductCode=dt.ProductCode AND h.EffectDate=dt.MaxEffectDate
     ORDER BY h.ProductCode
于 2009-06-09T16:01:29.863 に答える
0

ProductCodeとEffectDateが行を一意に識別すると仮定すると、次のことができます。

SELECT *
  FROM productpricehistory
     , (SELECT productcode
             , MAX(effectdate) effectdate
          FROM productpricehistory
         GROUP BY productcode) maxhistory
 WHERE productpricehistory.productcode = maxhistory.productcode
   AND productpricehistory.effectdate = maxhistory.effectdate
   AND IsActive = TRUE;

ProductCodeとEffectDateが行を一意に識別しない場合、HistoryIdが一意であり、HistoryIdの増加はEffectDateの増加も意味すると想定できる場合は、EffectDateの代わりにHistoryIdを使用することをお勧めします。

編集:私はあなたとは異なる方法でアクティブを扱っていたことに気づきました-IsActiveは特定のEffectDateにのみ適用されると想定していましたが、「IsActive」をfalseに設定すると、製品全体が非アクティブ化されます。それに応じて、IsActive=trueで新しい行を作成することで製品を後でアクティブ化できると想定して更新しました。

于 2009-06-09T15:52:19.890 に答える