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

2024-09-27 19:22:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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 ;
       """

Tags: 数据方法idsqlonasstatsselect
2条回答

假设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;
       """

distinct on子句中的列(或列集)定义了组:如果您希望每个“stock”有一行,那么列stock应该属于该子句

然后,您需要一个order by:它以distinct on列开始,然后是一个或多个列,这些列定义了每个组中应该保留哪一行:这就是“日期”列的位置

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

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

相关问题 更多 >

    热门问题