在 PostGreSQL 中获取具有最新日期的项目

Getting item with most recent date in PostGreSQL

提问人:gwydion93 提问时间:10/14/2023 更新时间:10/14/2023 访问量:42

问:

假设我查询了一个名为 items_run 的表以获得以下结果:

object_id  item_id  run_date
    0       1010    8/1/2023
    1       1020    8/3/2023
    2       1030    8/4/2023
    3       1010    8/5/2023
    4       1020    8/6/2023

查询如下:

SELECT object_id,  
       item_id,
       run_date
FROM items_run
WHERE run_date > '2023-07-30'

我想调整我的查询,以选择仅包含特定item_id的最新run_date的行。所以它看起来像这样:

    object_id  item_id  run_date
       0        1010    8/5/2023
       1        1020    8/6/2023
       2        1030    8/4/2023

我试图添加,但这只是返回了一个空表。我怎样才能在这里实现我的目标?WHERE run_date > '2023-07-30' AND run_date = (SELECT MAX(run_date) FROM items_run)

PostgreSQL 日期时间 过滤器

评论


答:

1赞 Frank Heikens 10/14/2023 #1

一个简单的聚合可以准确地为您提供所需的内容:

SELECT
    MIN(object_id)
    , item_id
    , MAX(run_date)
FROM items_run
WHERE run_date > '2023-07-30'
GROUP BY item_id
ORDER BY 1; -- first column

评论

0赞 gwydion93 10/15/2023
我选择了这个答案,因为这是获得我想要的结果的最简单方法。
1赞 Nile Lazarus 10/14/2023 #2

您可以尝试此查询,看看它是否有效:

SELECT object_id, item_id, run_date
FROM items_run
WHERE (item_id, run_date) IN
  (SELECT item_id, MAX(run_date)
   FROM items_run
   WHERE run_date > '2023-07-30'
   GROUP BY item_id)

这应该可以帮助您获得所需的结果。

1赞 Zegarek 10/14/2023 #3

DISTINCT ON 为您提供每个组的最新信息。最近的日期在第 3、4 和 2 行中。演示:

select distinct on (item_id) *
from items_run
order by item_id,
         run_date desc;
object_id item_id run_date
3 1010 2023-08-05
4 1020 2023-08-06
2 1030 2023-08-04

如果在输出示例中只应该是一个序数,则将其替换为 row_number()object_id

select row_number()over() as object_id,
       * 
from (
    select distinct on (item_id) 
        item_id,
        run_date
    from items_run
    order by item_id,
             run_date desc
) as subquery;
object_id item_id run_date
1 1010 2023-08-05
2 1020 2023-08-06
3 1030 2023-08-04