製品のLeetCode-1164。指定した日付の価格(中)UNION

製品データシート:製品

+ --------- + --------------- +
|カラム名|タイプ|
+ --------------- + + ---------
| PRODUCT_ID | int型|
| NEW_PRICE | int型|
| CHANGE_DATE | DATE |
+ --------------- + -------- - +
このテーブルの主キーは(PRODUCT_ID、CHANGE_DATE)です。
このテーブルの各行は、特定の日付変更後の製品の新しい価格を記録しています。
 

変更前のすべての製品の価格が10であると仮定すると、2019年8月16日にすべての製品の価格を見つけるためにSQLを記述します。

結果は次の形式で示します。

製品テーブル:
+ ------------ + ----------- + ------------- +
| PRODUCT_ID | NEW_PRICE | CHANGE_DATE |
+ ------------ + ----------- + ------------- +
| 1 | 20 | 2019年8月14日|
| 2 | 50 | 2019年8月14日|
| 1 | 30 | 2019年8月15日|
| 1 | 35 | 2019年8月16日|
| 2 | 65 | 2019年8月17日|
| 3 | 20 | 2019年8月18日|
+ ------------ + ----------- + ------------- +

結果テーブル:
+ ------------ + ------- +
| PRODUCT_ID | 価格|
+ ------------ + ------- +
| 2 | 50 |
| 1 | 35 |
| 3 | 10 |
+ ------------ + ------- +

出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/product-price-at-a-given-date
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

モデレーション:を見てSQLを書く  2019年8月16日 、すべての製品の価格、価格の変更の前にすべての製品であることが想定される  10。

思考:

問題解決:

難易度のこの質問は、我々は二つの状況に対処する必要があるということです。

前2019年8月16日の日のために、製品の価格を変更し、価格への最後の修正を見つけるためだけの必要性
の前にのための製品2019年8月16日の日の価格を変更していない、我々は10の初期の価格に戻る必要があり
、Aより自然な考え方は、最終的な価格の順序に従って、その後、UNIONを使用して組み合わせ、2例の結果を計算することです

最初のケースでは、我々は持っています:

SELECT product_id, new_price AS price
FROM Products
WHERE (product_id, change_date) IN (SELECT product_id, MAX(change_date)
                                    FROM Products
                                    WHERE change_date <= '2019-08-16'
                                    GROUP BY product_id)


後者の場合、我々は持っています:

SELECT DISTINCT product_Id, 10 AS price
FROM Products
WHERE product_id NOT IN (SELECT product_id FROM Products WHERE change_date <= '2019-08-16')


最後に、2例は、価格に応じて組み合わせて、選別しました。

SELECT * 
FROM 
(SELECT product_id, new_price AS price
 FROM Products
 WHERE (product_id, change_date) IN (
                                     SELECT product_id, MAX(change_date)
                                     FROM Products
                                     WHERE change_date <= '2019-08-16'
                                     GROUP BY product_id)

 UNION

 SELECT DISTINCT product_id, 10 AS price
 FROM Products
 WHERE product_id NOT IN (SELECT product_id FROM Products WHERE change_date <= '2019-08-16')
) tmp
ORDER BY price DESC

知識ポイント:

公開された118元の記事 ウォンの賞賛2 ビュー4825

おすすめ

転載: blog.csdn.net/Hello_JavaScript/article/details/104611645