如何将我的 postgreSQL 查询编辑为 select 几列的最新行(按日期)

How to edit my postgreSQL query to select the most recent row by date for several columns

我有一个查询,我试图 select 基于日期的最新行。所以我希望我的查询做的是 select 我数据库中几列的最新数据点。

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 只是用户提供的股票列表。

此应用程序的目标是检索金融数据点的最新观察结果。我的查询工作正常,但它 select 是每只股票的所有行,而我只想要每只股票的最新行。

如何编辑我的查询以解决上述问题?我尝试了一些使用 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 列开头,后跟一个或多个列,用于定义每个组中应保留的行:这是哪里“日期”列。

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

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

假设 id 列是相当于 stock 的键列(如问题中所述)-您可以使用 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;
       """