2016-02-26 37 views
0

我试图选择具有max(date_added)付费方面的行,以仅在col_a和col_b中使用重复值,log_id是唯一的。我已经看到DISTINCT ON和使用窗口函数的解决方案,但是我无法获得正确的语法来获得我想要的结果。根据最大日期时间戳选择列

从这个表:

 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
| log_id | col_a | col_b | col_c | col_d | col_e |  date_added  | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
|  1 | ACME | West | 14 | 27 | A  | 2016-01-01 12:45:00.453 | 
|  2 | ACME | West | 17 | 31 | A  | 2016-01-02 07:33:24.551 | 
|  3 | ACME | East | 13 | 27 | B  | 2016-01-01 11:43:21.223 | 
|  4 | ACME | East | 17 | 28 | A  | 2016-01-03 09:15:50.113 | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 

我怎样才能返回此:

 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
| log_id | col_a | col_b | col_c | col_d | col_e |  date_added  | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 
|  2 | ACME | West | 17 | 31 | A  | 2016-01-02 07:33:24.551 | 
|  4 | ACME | East | 17 | 28 | A  | 2016-01-03 09:15:50.113 | 
+--------+-------+-------+-------+-------+-------+-------------------------+ 

回答

0

使用distinct on很简单:

select distinct on (col_a, col_b) 
    * 
from 
    yourtable 
order by 
    col_a, col_b, -- columns from `distinct on` should be in the `order by` clause 
    -- and here is a max value of date_added for every distinct (col_a, col_b) pairs 
    -- because of descending order 
    date_added desc; 
0

一个方法是使用窗口函数...类似...

with cte as (SELECTlog_id,col_a,col_b,col_c,col_d, col_e, date_added, 
        row_number() over (partition by col_A, col_B order by date_added desc) rn 
      FROM tableName) 
SELECT log_id,col_a,col_b,col_c,col_d,col_e,date_added 
FROM cte 
WHERE rn = 1; 

这是为每个col_A和col_B分组分配一个行号(将每个A,b组的行号重置为1)然后仅返回行号为1(具有最大日期)的那些记录

或在窗口函数之前...我们得到每个col_a中最大日期的一组数据, Col_B组,然后返回到基本集以限制数据。

Select A.* 
FROM TableName A 
INNER JOIN (SELECT max(date_added) mda, col_A, col_B 
      FROM tableName) B 
on B.MDA = A.Date_Added 
and B.Col_A = A.Col_A 
and B.Col_B = A.Col_B