按位置计算分区其余部分的一半

问题描述 投票:0回答:2

我正在尝试实现以下结果:

enter image description here

现在,该小组来自

 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%的分区有关,或者类似的问题,但是我想那不存在。

sql sql-server tsql sum window-functions
2个回答
1
投票

我认为窗口函数无法完成您想要的事情。您可以改用相关子查询,其逻辑如下:

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

0
投票

我的优势是我之前曾帮助过他,并且有一些额外的背景。

该上下文是,这只是很长的公用表表达式链的后期。不幸的是,这意味着自连接和/或相关子查询非常昂贵。

最好,这应该使用窗口函数来回答,因为数据集已经在适当的排序和分区中可用。

我的读物是这个...

[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

注意:在列名中使用&%太可怕了,不要这样做;)] >>

© www.soinside.com 2019 - 2024. All rights reserved.