【问题标题】:How can I increment the numerical value in my WHERE clause using a loop?如何使用循环增加 WHERE 子句中的数值?
【发布时间】:2026-01-20 13:55:02
【问题描述】:

我目前正在使用下面的 UNION ALL 解决方法来计算每个 ticker 对应的 rownumold_eps_tfq 回归斜率/strong> 值(请参阅WHERE rownum < x)。我很想知道当rownum < 4old_eps_tfq 是什么,然后将 4 增加 1 以找出 old_eps_tfq > 是当rownum < 5,等等(有~20 rownum)

我可以为此使用 PL/pgSQL 吗?

SELECT * FROM(
    WITH regression_slope AS(
        SELECT
            ROW_NUMBER() OVER ( PARTITION BY ticker ORDER BY earnings_growths_ped) AS rownum,
            *
        FROM "ANALYTICS"."vEARNINGS_GROWTHS"
        --WHERE ticker = 'ACN' 
        ORDER BY ticker )   
    SELECT
        ticker,
        current_period_end_date,
        max(earnings_growths_ped) AS max_earnings_growths_ped, 
        --max(rownum) AS max_rownum, 
        round(regr_slope(old_eps_tfq, rownum)::numeric, 2) AS slope,
        round(regr_intercept(old_eps_tfq, rownum)::numeric, 2) AS y_intercept,
        round(regr_r2(old_eps_tfq, rownum)::numeric, 3) AS r_squared
    FROM regression_slope  
    WHERE rownum < 4
    GROUP BY ticker, current_period_end_date
    ORDER BY ticker asc ) q

UNION ALL 

SELECT * FROM(
    WITH regression_slope AS(
        SELECT
            ROW_NUMBER() OVER ( PARTITION BY ticker ORDER BY earnings_growths_ped) AS rownum,
            *
        FROM "ANALYTICS"."vEARNINGS_GROWTHS"
        --WHERE ticker = 'ACN' 
        ORDER BY ticker )   
    SELECT
        ticker,
        current_period_end_date,
        max(earnings_growths_ped) AS max_earnings_growths_ped, 
        --max(rownum) AS max_rownum, 
        round(regr_slope(old_eps_tfq, rownum)::numeric, 2) AS slope,
        round(regr_intercept(old_eps_tfq, rownum)::numeric, 2) AS y_intercept,
        round(regr_r2(old_eps_tfq, rownum)::numeric, 3) AS r_squared
    FROM regression_slope  
    WHERE rownum < 5
    GROUP BY ticker, current_period_end_date
    ORDER BY ticker asc ) q

Here is my table

【问题讨论】:

  • 请在您的问题中以纯文本形式插入数据样本,而不是图像。

标签: postgresql loops plpgsql control-flow


【解决方案1】:

顶部查询SELECT * FROM (...) q 听起来毫无用处。 然后你可以试试这个:

WITH regression_slope AS(
    SELECT
        ROW_NUMBER() OVER ( PARTITION BY ticker ORDER BY earnings_growths_ped) AS rownum,
        *
    FROM "ANALYTICS"."vEARNINGS_GROWTHS"
    --WHERE ticker = 'ACN' 
    ORDER BY ticker )   
SELECT
    max,
    ticker,
    current_period_end_date,
    max(earnings_growths_ped) AS max_earnings_growths_ped, 
    --max(rownum) AS max_rownum, 
    round(regr_slope(old_eps_tfq, rownum)::numeric, 2) AS slope,
    round(regr_intercept(old_eps_tfq, rownum)::numeric, 2) AS y_intercept,
    round(regr_r2(old_eps_tfq, rownum)::numeric, 3) AS r_squared
FROM regression_slope
INNER JOIN generate_series(4, 24) AS max -- the range 4 to 24 can be adjusted to the need
   ON rownum < max
GROUP BY max, ticker, current_period_end_date
ORDER BY max asc, ticker asc

【讨论】: