Sql 根据最大日期时间戳选择列

Sql 根据最大日期时间戳选择列,sql,postgresql,Sql,Postgresql,我正在尝试选择最大值(添加日期)的行,该行仅涉及列a和列b中的重复值,且log\u id是唯一的。我见过使用DISTINCT ON和使用窗口函数的解决方案,但我无法获得正确的语法来获得我想要的结果 从该表中: +--------+-------+-------+-------+-------+-------+-------------------------+ | log_id | col_a | col_b | col_c | col_d | col_e | date_added

我正在尝试选择最大值(添加日期)的行,该行仅涉及列a和列b中的重复值,且log\u 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 | +--------+-------+-------+-------+-------+-------+-------------------------+ +--------+-------+-------+-------+-------+-------+-------------------------+ |添加日志id、col a、col b、col c、col d、col e、日期| +--------+-------+-------+-------+-------+-------+-------------------------+ |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 | +--------+-------+-------+-------+-------+-------+-------------------------+ +--------+-------+-------+-------+-------+-------+-------------------------+ |添加日志id、col a、col b、col c、col d、col e、日期| +--------+-------+-------+-------+-------+-------+-------------------------+ |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| +--------+-------+-------+-------+-------+-------+-------------------------+
一种方法是使用窗口函数。。。类似于

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;
这样做的目的是按照添加日期的降序为列a和列B的每个分组分配一个行号(将每个a、B组的行号重置为1),然后仅返回行号为1(具有最大日期)的记录

或者在窗口函数之前。。。我们在每个列a和列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

在上使用
distinct,很简单:

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;