[英]SQL Server Cross Apply on itself + Cross Apply performance issues
我有以下內容:
CREATE TABLE #MASTER_POSANDTRANS (ID CHAR(30),
QUANTITY INT,
START_OR_TRADE_DATE DATE)
VALUES
('APPLES ','150000','20150501'), ('PEARS','220000','20150501'),
('APPLES ','-75000','20150506'), ('APPLES ','-65000','20150508'),
('APPLES ','10000','20150516'), ('APPLES ','-20000','20150519'
('PEARS','-110000','20150506'), ('PEARS','-100000','20150519')
我想說“一開始我有15萬個蘋果,所以我的整體蘋果排名很高”
這是我目前解決這個小難題的方式:
SELECT
MPT.ID,
MPT.QUANTITY,
MPT.START_OR_TRADE_DATE,
APPLY_RES.QUANTITY as 'FIRST AVAILABLE QUANTITY',
CASE
WHEN APPLY_RES.QUANTITY > 0
THEN 'LONG'
ELSE 'SHORT'
END as 'L/S Indicator'
FROM
#MASTER_POSANDTRANS as MPT
CROSS APPLY
(SELECT TOP 1
MPT_APPLY.QUANTITY
FROM
#MASTER_POSANDTRANS as MPT_APPLY
WHERE
MPT_APPLY.ID = MPT.ID) APPLY_RES
提供的表格簡化了多個查詢和並集的結果,並在大約3秒鍾內吐出了大約387行。 但是,當我嘗試將解決方案應用於這387行結果時,我的查詢返回了正確的結果,但需要21秒而不是3秒。
有什么改進建議嗎?
還有一點難題:
第一個可用的“交易”決定我是多頭還是空頭
另一個更復雜的問題(對於那些喜歡拼圖的人)是采用平均加權持倉來決定在此期間我是多頭還是空頭。 例如,假設在19日進行了最后一次蘋果交易后,我還剩下0個蘋果,然后又賣出了100萬個蘋果。 這意味着從5月19日至5月31日,我缺席100萬。 (31-19)* -1,000,000 <(19-1)*(該月售出/購買的蘋果的平均數量),因此我當月持有的蘋果被認為是空頭。 如果兩者在任何時候平衡,我將取第1點的值。
您交叉應用選擇缺少訂購依據(日期?)。 它不是確定性的,並且不能保證您確實會獲得第一個記錄。
對於您的樣本數據,此查詢具有更好的查詢計划:
SELECT
MPT.ID,
MPT.QUANTITY,
MPT.START_OR_TRADE_DATE
, APPLY_RES.QUANTITY as 'FIRST AVAILABLE QUANTITY',
CASE
WHEN APPLY_RES.QUANTITY > 0
THEN 'LONG'
ELSE 'SHORT'
END as 'L/S Indicator'
From MASTER_POSANDTRANS AS MPT
Inner Join (
Select ID, QUANTITY, N = ROW_NUMBER() over (Partition by ID order by START_OR_TRADE_DATE)
From MASTER_POSANDTRANS
) as APPLY_RES on APPLY_RES.ID = MPT.ID
Where APPLY_RES.N = 1
--Order By MPT.ID, MPT.START_OR_TRADE_DATE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.