製品データシート:製品
+ --------- + --------------- +
|カラム名|タイプ|
+ --------------- + + ---------
| 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
知識ポイント: