sql - 根据相关表中的最新值获取表中的条目

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

我在 Postgresql 中有一个看似微不足道的请求,但我无法破解它。

SQLFiddle:http://sqlfiddle.com/#!15/dc955/31

文件上传表:

id  file_name
1   file001
2   file002
3   file003
4   file004

文件状态表:

id  file_upload_id  file_status_id  status_date
1   1                1               October, 16 2015 19:22:51
2   1                2               October, 17 2015 09:19:20
3   1                3               October, 17 2015 09:20:51
4   1                4               October, 17 2015 09:22:51
5   2                1               October, 17 2015 13:45:10
6   3                1               October, 17 2015 09:22:57
7   1                1               October, 17 2015 23:22:12

配置文件状态:

id  status_code status_name
1   001          Unprocessed
2   002          Queued
3   003          Staging
4   004          Production

得到三个表:file_upload <--> file_status <--> config_file_statusfile_status 表保存文件在处理过程中可能经历的各种状态

我需要的是获取最新/最新 file_status_id = 1 文件的 file_upload.id, file_upload.file_name, file_status.file_status_id 即 Unprocessed 这实际上是最初上传文件时由上传应用程序创建的状态

到目前为止我已经尝试过:

select file_upload.file_name, 
max(file_status.file_status_id) as latest_status
from file_upload, file_status, config_file_status
where file_upload.id = file_status.file_upload_id and
file_status.file_status_id = config_file_status.id 
Group By file_upload.file_name;

它不仅没有返回 file001 的正确最新状态,而且查询感觉像是一个过度杀戮。

我正在寻找的是实现上述目标的正确 SQL 语法,但如果可以的话,也在 SQLAlchemy Core 中提供相同的语法。

使用 PostgreSQL 9.3

最佳答案

您可以使用 distinct on (s.file_upload_id)。将 status_date desc 放入 order by 以获得每个文件的最新上传日期。

select distinct on (s.file_upload_id) 
    s.file_upload_id, 
    u.file_name,
    s.file_status_id
from file_status s
join file_upload u on u.id = s.file_upload_id
where file_status_id = 1
order by file_upload_id, status_date desc;

SqlFiddle

如果您仅在最新上传的内容中搜索 file_status_id,请将 where 子句移到查询之外:

select *
from (
    select distinct on (s.file_upload_id) 
        s.file_upload_id, 
        u.file_name,
        s.file_status_id
    from file_status s
    join file_upload u on u.id = s.file_upload_id
    order by file_upload_id, status_date desc
    ) sub
where file_status_id = 2;

关于sql - 根据相关表中的最新值获取表中的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185722/

相关文章:

PHP SQL 插入错误

database - 架构设计 : How do you incorporate "total"?

python - 与 PostgreSQL 数据库的 SQLAlchemy/psycopg2 连接是否加密

Postgresql:从 csv 文件复制,偶尔缺少列

sql - 如何在postgres中加入空值填充行

python - 使用 SqlAlchemy Flask 从数据库中删除一行?

python - 数据库列的混合内容(float || unicode)

MYSQL - 将两个选择的结果插入表中

android - SQlite 数据库 VS Room 持久化库

mysql - SQL查询以计算相同日期的条目