如何按group by子句中的日期获取最新项目

时间:2019-03-25 15:38:09

标签: sql postgresql greatest-n-per-group

我正在运行以下查询以获取基于日期的最新记录

select myItem,to_timestamp(my_date/1000) 
from history_table
where to_timestamp(sign_date/1000)::date >= '2019-01-01' 
    and myItem = 'SomeItem' 
group by myItem,to_timestamp(my_date/1000) 
order by to_timestamp(my_date/1000) 
DESC LIMIT 1;

这将返回如下数据:

         myItem          |      to_timestamp
----------------------+------------------------
 SomeItem                | 2019-02-20 15:37:57+00
(1 row)

但是如果我删除LIMIT 1,那么我会得到:

         myItem          |      to_timestamp
----------------------+------------------------
 SomeItem             | 2019-02-20 15:37:57+00
 SomeItem             | 2019-02-15 13:47:43+00
 SomeItem             | 2019-02-08 19:02:57+00
 SomeItem             | 2019-02-08 12:42:34+00
 SomeItem             | 2019-02-07 21:07:16+00
 SomeItem             | 2019-02-07 21:04:26+00
 SomeItem             | 2019-02-04 22:01:42+00
(7 rows)

问题

我想删除myItem = 'SomeItem'子句,以便我可以基于my_date获得每个项目的最新记录。我该怎么办?

3 个答案:

答案 0 :(得分:1)

在PostgreSQL中,您为此使用DISTINCT ON

select distinct on (myItem) myItem, to_timestamp(my_date/1000)
from history_table
where to_timestamp(sign_date/1000)::date >= date '2019-01-01' 
order by myItem, to_timestamp(my_date/1000) desc;

在检索每个myitem的最新行时,可以在select子句中添加更多列。

编辑:如果只是要显示每个项目的最大日期,我会选择克里斯蒂安的答案。当您要显示的表中有更多列时,我的解决方案是合适的。

答案 1 :(得分:1)

尝试使用MAX(to_timestamp(my_date/1000)),查询:

select myItem, MAX(to_timestamp(my_date/1000))
from history_table
where to_timestamp(sign_date/1000)::date >= '2019-01-01'9 
group by myItem
order by myitem;

答案 2 :(得分:1)

  1. 您不应该按日期分组。只有您的物品才能确定组。
  2. 不要将值转换为整个最大值,因为它将对组中的每一行执行该操作,然后确定最大值。仅转换最大值-应该更快

在T-Sql中:

select
    myItem,
    to_timestamp(MAX(my_date)/1000) as my_date_Timestamp
from history_table
Group by myItem
Order by my_date_Timestamp DESC