2017-04-13 36 views
0

我有价格和日期的ID列表(不同日期的同一零件编号的多次出现),并希望返回最近的价格日期和第二大最近的价格日期。我希望价格和日期按列分隔,这意味着我只需要一次出现ID。Oracle SQL返回最新和下一个最新的价格和日期

例如(型号和价格都数和PriceDate和价格结束日期以月,日,年格式的日期)

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 

我已经看到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