我在 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_status。 file_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;
如果您仅在最新上传的内容中搜索 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/