-1

3列のテーブルがあります。以下は、デモ用のほんの数エントリの例です。この表は、商品の価格が変更される日付を表しています。特定の日付のすべてのアイテムの価格を教えてくれるクエリが必要です。特定の日付は、価格変更の間にある場合があります。価格は午前 0 時に変更されるため、変更日、つまり、その時点から前回の変更の前日までの価格です

itemCode  datePriceEffective  price  
AB         2012-01-01          9.99  
AB         2012-03-02          10.50  
XY         2011-09-20          34.99  

特定の日付のすべての商品の価格を取得したいと考えています。すべての日付のエントリではなく、価格が変更される日付のみです。したがって、2012-03-05 が返されます

AB 10.50
XY 34.99

2012-02-27 は次を返します。

AB 9.99  
XY 34.99

これを取得するために必要な SQL クエリは、私をエスケープします。回答ありがとうございます。

回答が間違った方向に進んでいるため編集されました。編集用のイタリック体を参照してください。

4

7 に答える 7

3

これは、itemCode ごとに datePriceEffective の降順で最初のレコードを取得します。

select top 1 with ties *
from ATable
where datePriceEffective <= @givenDate
order by row_number() over (partition by itemCode 
                            order by datePriceEffective desc)
于 2012-04-05T10:34:54.367 に答える
2
SELECT itemCode,price FRom TableNameHere WHERE datePriceEffective <= '2012-03-05'

詳細情報の後に編集 - フォローしやすくするための「簡単な」回答です。

必要な日付範囲で有効なアイテムの最新の日付を取得し、テーブルをそれ自体に結合してその日付の価格を取得しています

SELECT t1.itemCode,t1.price FROM 
  (
  SELECT itemCode,MAX(datePriceEffective) AS datePriceEffective
  FROM TableNameHere
  WHERE datePriceEffective <= '2012-03-05'
  ) a
INNER JOIN TableNameHere t1 ON t1.itemCode = a.itemCode AND t1.datePriceEffective = a.datePriceEffective
于 2012-04-05T10:12:53.243 に答える
1

次のようにテーブルに参加し直す必要があります。

declare @effdate datetime
set @effdate = CONVERT(datetime,'2012-02-27')

;WITH CTE_DATA as (
    select itemCode='AB',  datePriceEffective = CONVERT(Datetime,'2012-01-01'),  price = 9.99
    union all select itemCode='AB',  datePriceEffective = CONVERT(Datetime,'2012-03-02'),  price = 10.50
    union all select itemCode='XY',  datePriceEffective = CONVERT(Datetime,'2011-09-20'),  price = 34.99
)
select
    d.itemcode,
    price
from
    CTE_DATA d
    join (
        select  
            itemcode,
            effdate = MAX(datepriceeffective)
        from CTE_DATA sub where sub.datepriceeffective <= @effdate
        group by itemcode
    ) x
        on x.itemCode = d.itemCode
        and x.effdate = d.datePriceEffective

CTEはこの例のためだけのものであることに注意してください。実際のテーブルと交換する必要があります。

更新:別のアプローチは、次のようにROW_NUMBERとPARTITIONを使用することです。

SELECT        
    itemcode,
    price
FROM     
   (
        SELECT   
            itemcode,
            price,
            rowno = ROW_NUMBER() over (partition by itemcode order by datePriceEffective desc)
        from
            CTE_DATA
            where datePriceEffective <= @effdate
    ) x
where 
    rowno = 1

(この選択を前のクエリの選択に置き換えて、データで試してみてください)

于 2012-04-05T10:24:12.120 に答える
1
declare @date datetime = '2012-03-05'

select distinct itemcode,
    (
        select top(1) itemprice 
        from mytable mt2 
        where 
            mt1.itemcode = mt2.itemcode and
            mt2.datepriceeffective <= @date
        order by datepriceeffective desc
    ) as itemprice
from 
    mytable mt1
where
    datepriceeffective <= @date
于 2012-04-05T10:33:50.553 に答える
1
SELECT b.itemCode, 
(SELECT Price FROM dbo.tblProducts a WHERE datePriceEffective = 
(SELECT MAX(a.datePriceEffective) FROM dbo.tblProducts a WHERE a.itemCode = b.itemCode)) AS Price
FROM dbo.tblProducts b
WHERE b.datePriceEffective <= '2012-03-05'
GROUP BY b.itemCode

私はそれをテストしました!各アイテムの最新の価格が表示されます

于 2012-04-05T10:40:43.020 に答える
0

'GivenDate'という別の列があるとすると、以下はクエリです。

SELECT itemCode, price
FROM tblName
WHERE GivenDate= '2012-03-05'
于 2012-04-05T10:21:49.017 に答える
0

これはsql2000で動作します

SELECT      s.itemCode
            , ( SELECT      TOP 1 price
                FROM        #MyTable
                WHERE       itemCode = s.itemCode
                            AND datePriceEffective < @SearchDate ) AS price
FROM        (
            SELECT DISTINCT itemCode 
            FROM   #MyTable
            ) s
于 2012-04-05T11:54:35.647 に答える