提问人:gwydion93 提问时间:10/14/2023 更新时间:10/14/2023 访问量:42
在 PostGreSQL 中获取具有最新日期的项目
Getting item with most recent date in PostGreSQL
问:
假设我查询了一个名为 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)
答:
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 |
评论