获取具有最新时间戳以及正确分组的记录

时间:2014-03-03 21:58:24

标签: sql oracle

这是一张包含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 个答案:

答案 0 :(得分:1)

您需要一个窗口聚合函数:

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