2016-11-14 15 views
1

製品とプロダクトキーに基づいて、列ord_byを更新します。 productとproduct_keyには最小値と最大値が1つしかありません。列の最大値と最小値を検索し、最初の列のSQLサーバーを更新します

E.g: Table 


    +-------------+---------+-------+--------+ 
| Product_key | product | price | ord_by | 
+-------------+---------+-------+--------+ 
|   1 | ABC  | 10 |  | 
|   1 | ABC  | 10 |  | 
|   1 | ABC  | 20 |  | 
|   1 | ABC  | 100 |  | 
|   1 | ABC  | 100 |  | 
|   2 | EFG  | 20 |  | 
|   2 | EFG  | 40 |  | 
|   3 | ABC  | 100 |  | 
+-------------+---------+-------+--------+ 

Expected output: 
+-------------+---------+-------+--------+ 
| Product_key | product | price | ord_by | 
+-------------+---------+-------+--------+ 
|   1 | ABC  | 10 | Min | 
|   1 | ABC  | 10 | Mid | 
|   1 | ABC  | 20 | Mid | 
|   1 | ABC  | 100 | Mid | 
|   1 | ABC  | 100 | Max | 
|   2 | EFG  | 20 | Min | 
|   2 | EFG  | 40 | Max | 
|   3 | ABC  | 100 | None | 
+-------------+---------+-------+--------+ 

私の試み:

;WITH ord_cte 
      AS (
       SELECT product 
        ,product_key 
        ,max(price) as max_price 
        ,min(price) as min_price 
       FROM t_prod_ord 

       group by product,product_key 

       ) 
      UPDATE t1 
SET ord_by = case 
when t2.max_price =t2.min_price then 'none' 
when t2.max_price=t1.price then 'max' 
when t2.min_price=t1.price then 'min' 
else 'mid' end 
      FROM t_prod_ord t1 
      INNER JOIN ord_cte t2 ON t1.product_key = t2.product_key and t1.product=t2.product 

それが列ord_byに対して複数の最大値と最小値を更新している、このクエリを使用しました。

答えて

3

Product_keyの順番に行番号をPriceで生成すると、ASCDESCの順になります。その後Min/Max

Count() Over()に集計ウィンドウ関数を見つけるために、CASE文で行番号を使用することで、私たちはここでNone

を見つけるためにそれを使用することができ、各Product_keyの合計数は、片道

で見つけましょう
;WITH cte 
    AS (SELECT *, 
       Row_number()OVER(PARTITION BY Product_key ORDER BY price) AS Min_KEY, 
       Row_number()OVER(PARTITION BY Product_key ORDER BY price DESC) AS Max_KEY, 
       Count(1)OVER(partition BY Product_key) AS cnt 
     FROM Yourtable) 
SELECT Product_key, 
     product, 
     price, 
     CASE 
     WHEN cnt = 1 THEN 'None' 
     WHEN Min_KEY = 1 THEN 'Min' 
     WHEN Max_Key = 1 THEN 'Max' 
     ELSE 'Mid' 
     END 
FROM cte 
1

アウトCTEで行う別の方法...

SELECT [Product_key], 
      [product], 
      [price], 
      CASE 
      WHEN Max(RN) 
        OVER(
         PARTITION BY PRODUCT_KEY, PRODUCT 
        )=1 AND RN=1 THEN 'NONE' 
      WHEN Min(RN) 
        OVER(
         PARTITION BY PRODUCT_KEY, PRODUCT 
        ) = RN THEN 'MIN' 
      WHEN Max(RN) 
        OVER(
         PARTITION BY PRODUCT_KEY, PRODUCT 
        ) = RN THEN 'MAX' 

      ELSE 'MID' 
      END ORDER_BY 
    FROM (SELECT *, 
        Row_number() 
        OVER(
         PARTITION BY PRODUCT_KEY, PRODUCT 
         ORDER BY PRICE) RN 
      FROM TABLE1)Z 
関連する問題