如何将我的 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 是每只股票的所有行,而我只想要每只股票的最新行。
如何编辑我的查询以解决上述问题?我尝试了一些使用 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 ;
"""
distinct on
子句中的列(或一组列)定义了组:如果您希望每个“股票”一行,那么列 stock 应该属于该条款。
然后,您需要一个 order by
:它以 distinct on
列开头,后跟一个或多个列,用于定义每个组中应保留的行:这是哪里“日期”列。
您的问题没有解释 table 中关键列的名称。假设我们有 id
和 date
,逻辑将是:
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;
"""
我有一个查询,我试图 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 是每只股票的所有行,而我只想要每只股票的最新行。
如何编辑我的查询以解决上述问题?我尝试了一些使用 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 ;
"""
distinct on
子句中的列(或一组列)定义了组:如果您希望每个“股票”一行,那么列 stock 应该属于该条款。
然后,您需要一个 order by
:它以 distinct on
列开头,后跟一个或多个列,用于定义每个组中应保留的行:这是哪里“日期”列。
您的问题没有解释 table 中关键列的名称。假设我们有 id
和 date
,逻辑将是:
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;
"""