我有一个postgres DB,其中大多数表都有一列"valid_time",指示该行中的数据何时表示,以及一个"analysis_time"列,指示何时进行估计(对于测量,这可能与有效时间相同或更晚,在预测的情况下可能更早)。通常,每个有效时间有多个分析时间,对应于不同的测量值(如果稍等片刻,给定时间内有更多数据可用,因此分析更好,但测量的及时性较低)和具有不同提前期的预测。
我正在使用SQLalchemy在Python中访问此数据库。
我想做的是能够拉出指定列最近 N 个唯一日期时间的所有行。例如,我可能需要 3 个最近的唯一有效时间,但这通常超过 3 行,因为这 3 个有效时间中的每一个都会有多个分析时间。
我是关系数据库的新手。从某种意义上说,这个问题有两个部分;如何在裸SQL中实现这一点,然后如何将其转换为SQLalchemy ORM?
这是您问题第一部分的解决方案。 。如何在 SQL 中执行此操作:
select t.*
from (select t.*,
dense_rank() over (order by validtime desc) as seqnum
from t
) t
where seqnum <= N;
这是使用dense_rank()
窗口/分析函数。 这将枚举时间值,并赋予相同的排名值。 where
子句只是选择您想要的数量。
我不确定SQL炼金术部分,但就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);