我有一个postgres数据库,其中大多数表都有一列'valid_time'表示该行中的数据何时表示,以及'analysis_time'列,表明估计何时进行(这可能是相同的)或者在测量情况下的有效时间之后的时间或在预测的情况下的早期时间。通常,每个有效时间有多个分析时间,对应于不同的测量(如果等一下,在给定时间内有更多数据可用,因此分析更好,但测量不太迅速),并且预测具有不同的提前期。
我正在使用SQLalchemy在Python中访问此数据库。
我想要做的是能够提取具有指定列的最新N个唯一日期时间的所有行。例如,我可能想要3个最近的唯一有效时间,但这通常会超过3行,因为这3个有效时间中的每一个都会有多个分析时间。
我是关系数据库的新手。从某种意义上说,这个问题有两个部分;如何在裸SQL中实现,然后如何将其转换为SQLalchemy ORM?
答案 0 :(得分:2)
以下是问题第一部分的解决方案。 。 。如何在SQL中执行此操作:
select t.*
from (select t.*,
dense_rank() over (order by validtime desc) as seqnum
from t
) t
where seqnum <= N;
这是使用dense_rank()
窗口/分析函数。这枚举了时间值,并给出了相同等级值的关系。 where
子句只选择你想要的数量。
答案 1 :(得分:1)
我不确定SQLalchemy部分,但就SQL查询而言,我会分两步完成:
获取时间。例如,像。
SELECT DISTINCT valid_time FROM MyTable LIMIT 3 ORDER BY valid_time DESC;
使用上一步作为子查询获取具有这些时间的行:
SELECT * FROM MyTable WHERE valid_time IN (SELECT DISTINCT valid_time FROM MyTable LIMIT 3 ORDER BY valid_time DESC);