Sql 选择每年的最大日期

Sql 选择每年的最大日期,sql,postgresql,select,subquery,max,Sql,Postgresql,Select,Subquery,Max,我的表格如下: user_id date 1 2020-11-15 1 2020-10-15 1 2020-09-15 1 2019-12-15 1 2019-11-15 2 2020-11-15 2 2020-10-15 2 2019-12-15 3 2020-10-15 3 2020-09-15 Select t.* From your_tabl

我的表格如下:

user_id  date
1        2020-11-15
1        2020-10-15
1        2020-09-15
1        2019-12-15
1        2019-11-15
2        2020-11-15
2        2020-10-15
2        2019-12-15
3        2020-10-15
3        2020-09-15
Select t.*
  From your_table t
 Where not exists (select 1 from your_table tt 
                    Where t.id = tt.id
                      And date_trunc('year', t.date) = date_trunc('year', tt.date)
                      And tt.date > t.date)
Select * from
(Select t.*,
       Row_number() over (partition by t.id, date_trunc('year', t.date) 
                          order by t.date desc) as rn
  From your_table t) t
Where rn = 1
我想为每个用户选择每年的最大日期,因此结果如下:

user_id  date
1        2020-11-15
1        2019-12-15
2        2020-11-15
2        2019-12-15
3        2020-10-15
要帮忙吗? 谢谢大家!

只需使用聚合:

select user_id, max(date)
from t
group by user_id, date_trunc('year', date);
如果您需要更多的列,请在上使用
distinct:

select distinct on (user_id, date_trunc('year', date)) t.*
from t
order by user_id, date_trunc('year', date), date desc;

您可以使用
不存在
,如下所示:

user_id  date
1        2020-11-15
1        2020-10-15
1        2020-09-15
1        2019-12-15
1        2019-11-15
2        2020-11-15
2        2020-10-15
2        2019-12-15
3        2020-10-15
3        2020-09-15
Select t.*
  From your_table t
 Where not exists (select 1 from your_table tt 
                    Where t.id = tt.id
                      And date_trunc('year', t.date) = date_trunc('year', tt.date)
                      And tt.date > t.date)
Select * from
(Select t.*,
       Row_number() over (partition by t.id, date_trunc('year', t.date) 
                          order by t.date desc) as rn
  From your_table t) t
Where rn = 1
或者您可以使用
行号
分析功能,如下所示:

user_id  date
1        2020-11-15
1        2020-10-15
1        2020-09-15
1        2019-12-15
1        2019-11-15
2        2020-11-15
2        2020-10-15
2        2019-12-15
3        2020-10-15
3        2020-09-15
Select t.*
  From your_table t
 Where not exists (select 1 from your_table tt 
                    Where t.id = tt.id
                      And date_trunc('year', t.date) = date_trunc('year', tt.date)
                      And tt.date > t.date)
Select * from
(Select t.*,
       Row_number() over (partition by t.id, date_trunc('year', t.date) 
                          order by t.date desc) as rn
  From your_table t) t
Where rn = 1