2017-08-08 47 views
0

這裏是我的樣本數據集如何選擇與MAX(日期)行並加入每行與以前的價格

id thing datetime  price 
----|-----|------------|---------- 
1 | A | 04/03/2009 | 399 
2 | B | 04/03/2009 | 244 
5 | C | 04/03/2009 | 555 
3 | D | 04/03/2009 | 300 
4 | A | 03/03/2009 | 200 
6 | B | 03/03/2009 | 500 
7 | C | 24/12/2008 | 600 
8 | D | 01/01/2009 | 700 
9 | A | 01/03/2009 | 250 
10 | B | 01/03/2009 | 400 
11 | C | 12/12/2008 | 300 
12 | D | 20/01/2008 | 600 

我需要從最大日期,然後每行的最後價格得到所有行。返回行應該像

id thing datetime  price last price 
---|-----|------------|--------|----------- 
1 | A | 04/03/2009 | 399 | 200 
2 | B | 04/03/2009 | 244 | 500 
5 | C | 04/03/2009 | 555 | 600 
3 | D | 04/03/2009 | 300 | 700 

我可以得到這在單Sql?在SQL語句需要這一點,SQLAlchemy的 Sry基因的任何錯誤提前, 謝謝:)

+0

您正在使用哪個'RDBMS'?不要涉及你不使用的產品 –

+0

你到目前爲止嘗試過什麼? – kaineub

+0

@P我現在正在使用mysql,試圖從sql-alchemy管理它 –

回答

1

這可能不是最好的方式,但它是SQL SERVER的解決方案,請查看

with MY_TABLE as(

SELECT 1 id, 'A' thing , cast('20090403' as date) datetime, 399 price UNION ALL 
SELECT 2 , 'B' , '20090403' , 244 UNION ALL 
SELECT 5 , 'C' , '20090403' , 555 UNION ALL 
SELECT 3 , 'D' , '20090304' , 300 UNION ALL 
SELECT 4 , 'A' , '20090303' , 200 UNION ALL 
SELECT 6 , 'B' , '20090303' , 500 UNION ALL 
SELECT 7 , 'C' , '20081224' , 600 UNION ALL 
SELECT 8 , 'D' , '20090301' , 700 UNION ALL 
SELECT 9 , 'A' , '20090301' , 250 UNION ALL 
SELECT 10 , 'B' , '20090301' , 400 UNION ALL 
SELECT 11 , 'C' , '20081212' , 300 UNION ALL 
SELECT 12 , 'D' , '20080120' , 600 

) 



SELECT id, 
     t1.thing, 
     DATETIME, 
     Y.price 
FROM MY_TABLE t1 
INNER JOIN (SELECT thing,price,rank()over(partition by thing order by datetime desc) as last_price 
      from MY_TABLE) as Y on Y.thing= t1.thing and Y.last_price =2 

WHERE datetime = (SELECT MAX(datetime) 
        FROM MY_TABLE t2 
        WHERE t1.thing = t2.thing) 
+0

這是行之有效的,但假設B沒有任何價格的最大日期,那麼它不應該顯示 –

+0

你的意思是價格= 0代表B ?,你能舉個例子說明你發佈的數據嗎? –

0

我覺得一個窗口功能,可以解決你的問題

select id, thing, datetime, price 
from (
select id, thing, datetime, price, rank()over(order by datetime desc) rk 
from yourTable) 
where rk = 1;