2014-03-03 34 views
0

這裏是ID,訂單時間和買家的電話號碼獲取與最近時間戳的記錄,並與適當的分組

我想包一個Oracle查詢篩選出的順序表latest phone order per each phone number

所以這可能要求MAX(order_time),但也需要通過電話號碼分組。

以下是例如表結構及數據,但實際訂單表中獲取約20字段,以便GROUP BY子句可以很長,所以進行的查詢非常笨拙

所以這可能是與最佳性能的最佳解決方案?

感謝

=========================================================== 
| order id |  order_time  |  phone  | 
=========================================================== 
|  228  | 12-23-2013 12:25:28 PM | 1234567890  | 
=========================================================== 
|  236  | 11-16-2013 11:46:24 AM | 6665558887 <- | 
=========================================================== 
|  249  | 02-21-2014 10:25:16 PM | 1234567890 <- | 
=========================================================== 
|  256  | 01-14-2014 10:25:33 PM | 4567891230  | 
=========================================================== 
|  269  | 02-21-2013 11:49:57 AM | 1234567890  | 
=========================================================== 
|  288  | 02-25-2014 01:25:05 PM | 4567891230 <- | 
=========================================================== 
|  ...  | ...................... | ..........  | 
=========================================================== 
|  299  | 12-23-2013 12:25:28 PM | 2223336669 <- | 
=========================================================== 

這是預期的查詢結果:

=========================================================== 
| order id |  order_time  |  phone  | 
=========================================================== 
|  236  | 11-16-2013 11:46:24 AM | 6665558887 <- | 
=========================================================== 
|  249  | 02-21-2014 10:25:16 AM | 1234567890 <- | 
=========================================================== 
|  288  | 02-25-2014 01:25:05 PM | 4567891230 <- | 
=========================================================== 
|  ...  | ...................... | ..........  | 
=========================================================== 
|  299  | 12-23-2013 12:25:28 PM | 2223336669 <- | 
=========================================================== 

回答

1

你需要一個窗聚合函數:

select * 
from 
(
    select tab.*, 
     rank() over (partition by phone order by order_time desc) rnk 
) dt 
where rnk = 1 
+0

_row_number()_適合比_Rank更好()_在這種情況下,我猜!但取決於OP的要求。當最大時間戳與兩個相同的記錄相匹配時,應該返回什麼,兩者或者只是一個.. rank返回前者.. rownumber後者! –

+1

MAX直接轉換爲RANK :-) – dnoeth

相關問題