查询项目列表(in)时,我可以对每个项目应用过滤器吗?



我正在查询一组公司的财务数据库,但我只想要每个公司最近一年的数据。

select ticker, date 
from company."financials_Income_Statement_yearly" fisy 
where ticker in ('IBM.US', 'AAPL.US')
order by date desc

我得到这样的东西:

IBM.US  2020-12-31
AAPL.US 2020-09-30
IBM.US  2019-12-31
AAPL.US 2019-09-30
IBM.US  2018-12-31
AAPL.US 2018-09-30
IBM.US  2017-12-31
AAPL.US 2017-09-30
IBM.US  2016-12-31

在本例中,我只想要最近的结果,即前2行。

当我在一个列表中发送数百个项目时,是否有一种简单的方法来进行此过滤?

您并不是在寻找过滤器——这是一种可以使用自连接的情况:

SELECT a.* FROM company."financials_Income_Statement_yearly" a
INNER JOIN
(
SELECT ticker, MAX(date) maxDate
FROM company."financials_Income_Statement_yearly"
WHERE ticker in ('IBM.US', 'AAPL.US')
GROUP BY ticker
) b
ON a.ticker = b.ticker
AND a.date = b.maxDate

(未测试)

如何将表连接到自身并在SQL中选择最大值

第一步是根据Ticker按最近的顺序(日期)创建每行排名。然后用1

筛选rank_https://dbfiddle.uk/?rdbms=postgres_13&小提琴= 4 d435469c1e288e5004e5d04e08e2fba

with ranking_data as (
select 
ticker,
date,
row_number() over(partition by ticker order by date desc) as rank_
from "financials_Income_Statement_yearly"
where ticker in ('IBM.US', 'AAPL.US')
)
select ticker, date from ranking_data where rank_ = 1

在Postgres中最好的方法是使用distinct on:

select distinct on (ticker) fisy.*
from company."financials_Income_Statement_yearly" fisy 
where ticker in ('IBM.US', 'AAPL.US')
order by ticker, date desc

最新更新