sql—按起始位置计算分区其余部分的一半

czfnxgou  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(502)

我正在努力取得以下成果:

现在,这个团队来自

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\u inv)的行总数,并且只对从该位置开始的那一半行的损益金额求和。
例如,当

seq = 2

seq\u inv将是=13,它的一半是6,所以我需要从seq=2对以下6个位置求和。
当seq=4时,到最后有11个位置(seq\u inv=11),所以一半是5,所以我想从seq=4算5个位置。
我希望这是有意义的,我正在试图提出一个规则,将能够适应我的情况,因为分区是什么给我的数字需要求和。
我也在想,如果有什么事与分区的前50%或类似的,但我猜这是不存在的。

inkz8wg9

inkz8wg91#

我的优势是我以前帮助过他,而且有一点额外的背景。
上下文是,这只是一个非常长的公共表表达式链的后期。不幸的是,这意味着自连接和/或相关子查询的开销很大。
最好使用窗口函数来解决这个问题,因为数据集已经具有适当的排序和分区。
我的阅读是。。。
这个 SUM(5:9) (表示第5行到第9行(含)的和等于 SUM(5:end) - SUM(10:end) 这让我想到。。。

WITH
  cumulative AS
(
  SELECT
    *,
    SUM([P&L]) OVER (PARTITION BY bracket_label ORDER BY event_id DESC)  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

注:使用

, & , % 在列名中是可怕的,不要这样做;)
编辑:已更正 ORDER BY 在累计总和中。

3j86kqsm

3j86kqsm2#

我不认为窗口函数可以做你想做的。您可以使用相关子查询代替,其逻辑如下:

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

相关问题