如何编辑我的postgreSQL查询,为多个列按日期选择最近的行



我有一个查询,试图根据日期选择最近的一行。因此,我希望我的查询为数据库中的几列选择最新的数据点。

sql = f"""SELECT DISTINCT ON (id), cast(marketcap as money), cast(week52high as money), cast(week52low as money)
, to_char(dividend_yield * 100, '99D99%%')
, pe_ratio, ROUND(beta,2) 
FROM security_stats 
WHERE security_stats.id IN ({placeholders});
"""

对于任何想知道的人来说,placeholders只是用户给出的股票列表。

此应用程序的目标是检索财务数据点的最新观测结果。我的查询运行良好,但它会选择每只股票的所有行,而我只需要每只股票最近的一行。

如何编辑我的查询以修复上述问题?我已经尝试了一些使用MAXLIMIT的方法,但无法使其工作!。

编辑:请注意,使用的列是iddate。这些应该是不同的,日期应该是最近的观察结果。

多亏了@GME,使用下面的方法,它才得以工作。也特别感谢@Somy向我展示了另一种方法!

sql = f"""SELECT DISTINCT ON (id) id, cast(marketcap as money), cast(week52high as money), cast(week52low as money)
, to_char(dividend_yield * 100, '99D99%%')
, pe_ratio, ROUND(beta,2) 
FROM security_stats 
WHERE security_stats.id IN ({placeholders}) ORDER BY id, date desc ;
"""

distinct on子句中的列(或列集(定义组:如果您希望每个"股票";,则列stock应属于该子句。

然后,您需要一个order by:它以distinct on列开始,然后是一个或多个列,这些列定义了每组中应保留的行:;日期";列。

您的问题没有解释表中关键列的名称。假设我们有iddate,逻辑是:

SELECT DISTINCT ON (id) ...
FROM security_stats 
WHERE ...
ORDER BY id, date desc 

假设id列是等价于股票的关键列(如问题中所述(-您可以使用如下的windows函数-

sql = f"""SELECT DISTINCT id, cast(marketcap as money), cast(week52high as money), cast(week52low as money)
, to_char(dividend_yield * 100, '99D99%%')
, pe_ratio, ROUND(beta,2)
from 
(Select t.*, 
row_number() over(partition by id order by date desc) as seq_num  
FROM security_stats t
WHERE t.id IN ({placeholders})) sst
WHERE sst.seq_num = 1;
"""

最新更新