2017-04-13 7 views
0

私は価格と日付を持つIDのリストを持っています(異なる日付の同じ製品番号が複数出現しています)、最新の価格の日付と2番目に多いもの最近の価格日付。価格と日付を列で区切ってIDを1つだけ表示する必要があることを意味します。例えばOracle SQLは最新のものと次に最も最近のものの価格と日付

ID Price PriceDate PriceEndDate 
1 5.01 6/2/99 5/1/05 
1 5.50 5/2/05 5/7/10 
1 5.62 5/5/98 6/1/99 
1 4.50 5/8/10 5/10/11 
2 3.50 7/2/86 7/3/86 
2 3.60 6/1/86 7/1/86 
2 3.99 7/4/86 9/9/12 
2 3.10 9/10/12 10/6/15 
3 2.55 5/5/16 5/6/16 
3 2.02 4/5/15 5/4/16 
3 1.50 3/2/14 4/4/15 

私は、クエリを必要とする何を返すように

ID Price PriceDate PriceEndDate SecondPrice SecPriceDate SecPriceEndDate 
1 4.50 5/8/10 5/10/11  5.50  5/2/05  5/7/10 
2 3.10 9/10/12 10/6/15  3.99  7/4/86  9/9/12 
3 2.55 5/5/16 5/6/16  2.02  4/5/15  5/4/16 
される(部品番号と価格は、月、日、年の形式で日付が番号とPriceDateと価格終了日されています)

SQL ServerとMySQLに関する質問はありましたが、現在はOracle SQLを使用しています。ありがとうございました!!

答えて

2

は、行としてデータを取得するには:

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY priceEndDate DESC) AS rn 
    FROM your_table t 
) 
WHERE rn <= 2; 

を次にあなたが行うことができます列に行PIVOTへ:

SELECT id, 
     "1_PRICE"   AS Price, 
     "1_PRICESTARTDATE" AS PriceDate, 
     "1_PRICEENDDATE" AS PriceEndDate, 
     "2_PRICE"   AS SecondPrice, 
     "2_PRICESTARTDATE" AS SecPriceDate, 
     "2_PRICEENDDATE" AS SecPriceEndDate, 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY priceEndDate DESC) AS rn 
    FROM your_table t 
) 
PIVOT (
    MAX(price) AS price, 
    MAX(priceStartDate) AS priceStartDate, 
    MAX(priceEndDate) AS priceEndDate 
    FOR rn IN (1, 2) 
); 
+0

グレートこの作品はあなたに感謝します! – mlin

関連する問題