[英]Select column based on max date timestamp
我试图选择具有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 | +--------+-------+-------+-------+-------+-------+-------------------------+
一种方法是使用窗口函数...类似...
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
distinct on
上面使用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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.