Sql 子选择中的外部表引用
我有两张表,一张代表股票交易: 吸墨纸Sql 子选择中的外部表引用,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有两张表,一张代表股票交易: 吸墨纸 TradeDate Symbol Shares Price 2014-09-02 ABC 100 157.79 2014-09-10 ABC 200 72.50 2014-09-16 ABC 100 36.82 以及存储所有符号的股票拆分历史记录的: 拆分 SplitDate Symbol Factor 2014-09-08 ABC 2
TradeDate Symbol Shares Price
2014-09-02 ABC 100 157.79
2014-09-10 ABC 200 72.50
2014-09-16 ABC 100 36.82
以及存储所有符号的股票拆分历史记录的:
拆分
SplitDate Symbol Factor
2014-09-08 ABC 2
2014-09-15 ABC 2
2014-09-20 DEF 2
我正试图写一份反映交易的报告,包括他们当前的分割调整系数应该是多少。对于这些表值,我希望报告如下所示:
TradeDate Symbol Shares Price Factor
2014-09-02 ABC 100 157.79 4
2014-09-10 ABC 200 72.50 2
2014-09-16 ABC 100 36.82 1
第一列直接取自吸墨纸-系数应代表自交易发生以来发生的分割调整(价格未分割调整)。
使问题复杂化的是,每个符号可能有多个拆分,这意味着我不能只外部连接拆分表
,否则我将开始复制行
我有一个子查询,我从中改编,允许我计算行的乘积,按符号分组,但是我如何只返回所有拆分记录的乘积,拆分日期发生在TradeDate之后
类似以下的查询
SELECT tb.TradeDate, tb.Symbol, tb.Shares, tb.Price, ISNULL(s.Factor, 1) AS Factor
FROM Blotter tb
LEFT OUTER JOIN (
SELECT Symbol, EXP(Factor) AS Factor
FROM
(SELECT Symbol, SUM(LOG(ABS(NULLIF(Factor, 0)))) AS Factor
FROM Splits s
WHERE s.SplitDate > tb.TradeDate -- tb is unknown here
GROUP BY Symbol
) splits) s
ON s.Symbol = tb.Symbol
返回错误“Msg 4104,级别16,状态1,第1行。无法绑定多部分标识符“tb.TradeDate”
如果没有内部WHERE
子句,我会得到如下结果:
TradeDate Symbol Shares Price Factor
2014-09-02 ABC 100 157.79 4
2014-09-10 ABC 200 72.50 4
2014-09-16 ABC 100 36.82 4
更新不能保证Blotter中的交易行是唯一的,因此我认为排除了一种建议的解决方案,即使用
分组方式
一种不太改变逻辑的方法是将因子计算放入表值函数中:
create function dbo.FactorForDate(
@Symbol char(4), @TradeDate datetime
) returns table as
return (
select
exp(Factor) as Factor
from (
select
sum(log(abs(nullif(Factor, 0)))) as Factor
from
Splits s
where
s.SplitDate > @TradeDate and
s.Symbold = @Symbol
) splits
);
select
tb.TradeDate,
tb.Symbol,
tb.Shares,
tb.Price,
isnull(s.Factor, 1) as Factor
from
Blotter tb
outer apply
dbo.FactorForDate(tb.Symbol, tb.TradeDate) s;
在一个语句中执行此操作将类似于:
select
tb.TradeDate,
tb.Symbol,
tb.Shares,
tb.Price,
isnull(exp(sum(log(abs(nullif(factor, 0))))), 1) as Factor
from
Blotter tb
left outer join
Symbol s
on s.Symbol = tb.Symbol and s.SplitDate > tb.TradeDate
group by
tb.TradeDate,
tb.Symbol,
tb.Shares,
tb.Price;
如果你能让它工作起来,它的性能可能会更好
对于任何语法错误,我深表歉意,目前无法访问SQL。有趣的想法-如果没有任何查询建议,我将在明天的工作中试一试。单一查询解决方案的一个问题是,不能保证Blotter中的行是唯一的。为了回答这个问题,我把它缩减到了一些基本字段,但即使有完整的表格,也完全有可能会发生多个匹配交易,因此因子值会因此发生偏移。