Sql 将join替换为只留下一个';表扫描';

Sql 将join替换为只留下一个';表扫描';,sql,tsql,pivot,inner-join,aggregate-functions,Sql,Tsql,Pivot,Inner Join,Aggregate Functions,我有财务数据。并要计算股东权益。基本上是这样的: 我有以下有效的查询: SELECT a.Ticker, a.Value - l.Value as 'ShareholdersEquity' FROM FinData a JOIN FinData l ON a.Ticker = l.Ticker AND a.Date = l.Date WHERE a.Type = 'assets' AND l.Type = 'liabilities' 但是对于一个有很多记录的表,这将很慢,因为当我用Ex

我有财务数据。并要计算股东权益。基本上是这样的:

我有以下有效的查询:

SELECT a.Ticker, a.Value - l.Value as 'ShareholdersEquity'
FROM FinData a 
JOIN FinData l 
ON a.Ticker = l.Ticker AND a.Date = l.Date 
WHERE a.Type = 'assets' 
AND l.Type = 'liabilities'

但是对于一个有很多记录的表,这将很慢,因为当我用Explain检查查询时(我使用Azure Data Studio),它会进行两次表扫描,这意味着更多的时间。如何将其重写得更快?

您可以尝试条件聚合而不是自连接:

select ticker, date, 
    sum(case when type = 'asset' then value else - value end) as ShareholdersEquity
from findata
where type in ('asset', 'liabilities')
group by ticker, date

谢谢,我确实看到了成本上的差异。我读到窗口函数很有用,但我仍然不知道如何使用它。我可以把这个查询转换成一个窗口函数吗?如果我有同样的大小写,但是更复杂的公式,比如(a-b)/(c+d),会怎么样?所有值同样来自一列,并基于另一列。