我有一个查询,试图根据日期选择最近的行。因此,我希望我的查询能够为数据库中的几列选择最新的数据点
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
只是用户给出的股票列表
此应用程序的目标是检索金融数据点的最新观测值。我的查询可以很好地工作,但它会选择每只股票的所有行,而我只需要最新的每只股票的行
如何编辑查询以修复上述问题?我尝试了一些使用MAX
和LIMIT
的方法,但无法使其工作
编辑:
请注意,使用的列是id
和date
。这些应该是不同的,日期应该是最近的观察结果
多亏@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 ;
"""
假设id列是与股票等价的键列(如问题中所述)-您可以使用windows功能,如下所示-
distinct on
子句中的列(或列集)定义了组:如果您希望每个“stock”有一行,那么列stock应该属于该子句然后,您需要一个
order by
:它以distinct on
列开始,然后是一个或多个列,这些列定义了每个组中应该保留哪一行:这就是“日期”列的位置您的问题没有向表中的关键列解释这些列的名称。假设我们有
id
和date
,逻辑是:相关问题 更多 >
编程相关推荐