计算 Postgresql 中连续范围的百分比变化

亚历克斯·尤苏波夫

我需要计算连续范围内的价格百分比变化。例如,如果价格开始向上或向下移动,并且我有一系列减少或增加的值,我需要获取该序列的第一个和最后一个值并计算变化。

我正在使用窗口滞后函数来计算方向,我的问题 - 我无法为序列生成唯一的 RANK 来计算百分比变化。我厌倦了 RANK、ROW_NUMBER 等的组合,但没有运气。

这是我的查询


WITH partitioned AS (
  SELECT
    *,
    lag(price, 1) over(ORDER BY time) AS lag_price

  FROM prices 
),
sequenced AS (
  SELECT
    *,
    CASE 
      WHEN price > lag_price THEN 'up'
      WHEN price < lag_price THEN 'down'
      ELSE 'equal'
    END
     AS direction
  FROM partitioned

),
ranked AS (
  SELECT
    *,
    -- Here's is the problem
    -- I need to calculate unique rnk value for specific sequence
    DENSE_RANK() OVER ( PARTITION BY direction ORDER BY time) + ROW_NUMBER() OVER ( ORDER BY time DESC) AS rnk
    -- DENSE_RANK() OVER ( PARTITION BY seq ORDER BY time),
    -- ROW_NUMBER() OVER ( ORDER BY seq, time DESC),
    -- ROW_NUMBER() OVER ( ORDER BY seq),
    -- RANK() OVER ( ORDER BY seq)

  FROM sequenced
),
changed AS (
  SELECT *,
    FIRST_VALUE(price) OVER(PARTITION BY rnk ) first_price,
    LAST_VALUE(price) OVER(PARTITION BY rnk ) last_price,
    (LAST_VALUE(price) OVER(PARTITION BY rnk ) / FIRST_VALUE(price) OVER(PARTITION BY rnk ) - 1) * 100 AS percent_change
    FROM ranked

)
SELECT
    *
FROM changed
ORDER BY time DESC;

带有示例数据的 SQLFiddle

在此处输入图片说明

亚历克斯·尤苏波夫

如果有人对这里的解决方案感兴趣,请组建另一个论坛:

  with ct1 as /* detecting direction: up, down, equal */
    (
      select
          price, time,
          case 
            when lag(price) over (order by time) < price then 'down'
            when lag(price) over (order by time) > price then 'up'
            else 'equal' 
          end as dir
      from
          prices
    )
    , ct2 as /* setting reset points */
    (
      select
          price, time,  dir,
          case 
              when coalesce(lag(dir) over (order by time), 'none') <> dir
              then 1 else 0
          end as rst
      from
          ct1
    )
    , ct3 as /* making groups */
    (
      select
          price, time, dir,
          sum(rst) over (order by time) as grp
      from
          ct2
    )
    select /* calculates min, max price per group */
        price, time, dir,
        min(price) over (partition by grp) as min_price,
        max(price) over (partition by grp) as max_price
    from
        ct3
    order by
        time desc;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算PostgreSQL中的百分比

来自分类Dev

在PostgreSQL中计算百分比

来自分类Dev

在PostgreSQL中计算一组指标的百分比变化

来自分类Dev

计算不连续日期的数据框中随时间的变化百分比

来自分类Dev

计算百分比仅显示100 perc PostgreSQL

来自分类Dev

PostgreSQL:熔化表格并计算不同组的百分比

来自分类Dev

Postgresql:如何正确计算百分比?

来自分类Dev

如何使用SQL(PostgreSQL)计算百分比?

来自分类Dev

使用 postgresql 连接查询计算百分比

来自分类Dev

计算百分比变化(熊猫)

来自分类Dev

计算范围百分比

来自分类Dev

如何计算库存百分比变化值的变化

来自分类Dev

计算蜂巢中的百分比

来自分类Dev

计算查询中的百分比

来自分类Dev

计算SSRS中的百分比

来自分类Dev

PostgreSQL:计算百分比,但是转换不起作用

来自分类Dev

PostgreSQL 使用多列计算百分比数字

来自分类Dev

如何在 postgresql 中计算组内的百分比?

来自分类Dev

用JavaScript计算百分比变化量

来自分类Dev

Python(Pandas)计算百分比变化

来自分类Dev

计算熊猫数据框的变化百分比

来自分类Dev

计算百分比变化(多变量)熊猫

来自分类Dev

计算百分比变化返回0

来自分类Dev

MongoDB编写查询以计算百分比变化

来自分类Dev

熊猫根据特定列计算百分比变化

来自分类Dev

计算不同组在固定年份的变化百分比

来自分类Dev

Stata计算年份之间的百分比变化

来自分类Dev

如何计算客户支出变化的百分比?

来自分类Dev

使用行号的PostgreSQL百分比变化