我正在尝试实现以下结果:
现在,该小组来自
SUM(CASE WHEN seqnum <= (0.5 * seqnum_rev) THEN i.[P&L] END) OVER(PARTITION BY i.bracket_label ORDER BY i.event_id) AS [P&L 50%],
我需要在每次迭代中计算从末尾到位置(seq_inv)的行总数,并仅对从该位置起一半的P&L求和。
例如,当
seq = 2
seq_inv将= 13,其中一半是6,所以我需要对seq = 2中的以下6个位置求和。
当seq = 4时,有11个位置到末尾(seq_inv = 11),所以一半是5,所以我想从seq = 4中计算5个位置。
我希望这是有道理的,我正在尝试提出一条规则,该规则将能够适应我所遇到的情况,因为划分的依据就是给我求和的数字。
我也在考虑是否与前50%的分区有关,或者类似的问题,但是我想那不存在。
我认为窗口函数无法完成您想要的事情。您可以改用相关子查询,其逻辑如下:
select
t.*,
(
select sum(t1.P&L]
from mytable t1
where t1.seq - t.seq between 0 and t.seq_inv/2
) [P&L 50%]
from mytable t
我的优势是我之前曾帮助过他,并且有一些额外的背景。
该上下文是,这只是很长的公用表表达式链的后期。不幸的是,这意味着自连接和/或相关子查询非常昂贵。
最好,这应该使用窗口函数来回答,因为数据集已经在适当的排序和分区中可用。
我的读物是这个...
[SUM(5:9)
(意味着第5行到第9行,包括第5行之和)等于SUM(5:end) - SUM(10:end)
这使我想到了...
WITH
cumulative AS
(
SELECT
*,
SUM([P&L]) OVER (PARTITION BY bracket_label ORDER BY event_id) AS cumulative_p_and_l
FROM
data
)
SELECT
*,
cum_val - LEAD(cumulative_p_and_l, seq_inv/2, 0) OVER (PARTITION BY bracket_label ORDER BY event_id) AS p_and_l_50_perc,
cum_val - LEAD(cumulative_p_and_l, seq_inv/4, 0) OVER (PARTITION BY bracket_label ORDER BY event_id) AS p_and_l_25_perc,
FROM
cumulative
注意:在列名中使用,
&
,%
太可怕了,不要这样做;)] >>