1

価格に基づいて更新する必要がある大量のデータがあります。非常に簡単に言えば、コード/サイズ 1 のアイテムの価格は、コード/サイズ 2 以下でなければなりません。コード/サイズ 2 は、コード/サイズ 3 以下でなければなりません。

Item       Code   Size  Price   
-------------------------------
66227019    OTH     1   $466
66227019    OTH     2   $486
66227019    OTH     3   $476
66227019    OTH     4   $537

66227019    IVC     1   $458
66227019    IVC     2   $428
66227019    IVC     3   $458
66227019    IVC     4   $458

次のようにする必要があります。

Item       Code   Size  Price   
-------------------------------
66227019    OTH     1   $466
66227019    OTH     2   $486
66227019    OTH     3   $486
66227019    OTH     4   $537

66227019    IVC     1   $458
66227019    IVC     2   $458
66227019    IVC     3   $458
66227019    IVC     4   $458

私はいくつかの自己結合を試みましたが、基本的に気が狂っています。どんな助けでも心から感謝します。

ありがとう!

4

4 に答える 4

3

SQL-Server 2012 の場合、これを使用できます。

; WITH cte AS
( SELECT *,
         MaxPrice = MAX(Price) 
                    OVER (PARTITION BY Item, Code
                          ORDER BY Size
                          ROWS BETWEEN UNBOUNDED PRECEDING
                                   AND 1 PRECEDING
                         ) 
  FROM Products
) 
UPDATE cte
SET Price = MaxPrice
WHERE Price < MaxPrice ;

SQL-Fiddleでテスト済み

于 2013-10-14T22:03:06.353 に答える
1

これで必要なものが得られますか?

UPDATE LaterRec
SET Price = PrevRec.Price
FROM Data AS LaterRec
    INNER JOIN Data AS PrevRec ON LaterRec.Item = PrevRec.Item AND LaterRec.Code = PrevRec.Code AND PrevRec.Size < LaterRec.Size
WHERE
        PrevRec.Price > LaterRec.Price
    -- Disregard this entry if there's a record *between* PrevRec and LaterRec
    AND NOT EXISTS (SELECT * FROM Data AS Intrmdt WHERE LaterRec.Item = Intrmdt.Item AND LaterRec.Code = Intrmdt.Code AND Intrmdt.Size > PrevRec.Size AND Intrmdt.Size < LaterRec.Size)
于 2013-10-14T22:00:51.450 に答える
1

答えは再帰的 CTE です。SQL SERVER のバージョンには依存しません。

    DECLARE @t TABLE
    (
        item        INT
        ,code       sysname
        ,SIZE       INT
        ,price      INT
    )
    INSERT INTO @t( item, code, SIZE, price )
                SELECT 1,'oth',1,466
    UNION ALL   SELECT 1,'oth',2,486
    UNION ALL   SELECT 1,'oth',3,476
    UNION ALL   SELECT 1,'oth',4,537

    UNION ALL   SELECT 1,'ivc',1,458
    UNION ALL   SELECT 1,'ivc',2,428
    UNION ALL   SELECT 1,'ivc',3,458
    UNION ALL   SELECT 1,'ivc',4,458

    SELECT * FROM @t

    ;WITH cte1 (item,code,size,price,rownum1,rownum2)
    AS
    (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY item,code ORDER BY item,code,SIZE) AS rownum1, ROW_NUMBER() OVER (ORDER BY item,code,SIZE) AS rownum2
        FROM @t
    ),  
    cte2 (item,code,size,price,rownum1,rownum2)
    AS
    (
        SELECT *
        FROM cte1 t1
        WHERE rownum2=1

        UNION ALL

        SELECT t1.item,t1.code,t1.size
                ,CASE   WHEN t1.price>=t2.price THEN t1.price 
                        WHEN t1.price<t2.price THEN t2.price
                END AS proce
                ,t1.rownum1,t1.rownum2
        FROM cte2 t2
        JOIN cte1 t1
            ON t2.rownum2+1=t1.rownum2
    )
    SELECT item,code,size,price FROM cte2

ここに画像の説明を入力

于 2013-10-14T22:11:13.410 に答える
0

あなたtのテーブルの名前は次のとおりです。

update t set price=p
from (
  select nxt.item i,nxt.code c,nxt.size s,max(cur.price) p
  from t cur join t nxt 
  on (cur.item=nxt.item and cur.code=nxt.code 
   and cur.size<nxt.size and cur.price>nxt.price)
  group by nxt.item,nxt.code,nxt.size      
  ) a
where item=i and code=c and size=s
于 2013-10-14T22:28:05.193 に答える