【问题标题】:How to assign a unique identifier to the first n rows of a query in postgresql?如何为postgresql中查询的前n行分配唯一标识符?
【发布时间】:2022-01-27 01:36:09
【问题描述】:

在 postgres SQL 中,如何将唯一标识符 (rn?) 分配给查询的前 n 行,并将唯一标识符分配给随后的 n 行?目标是按代码和唯一标识符进行分组,有关详细信息,请参阅实际与预期的屏幕截图。

实际查询

SELECT 
    *,
    SUM(eps_diluted) OVER (PARTITION BY ticker ORDER BY rn ASC ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) AS test_eps_diluted
FROM(
    SELECT 
        "PK",
        ticker,
        period_end_date,
        eps_diluted,
        ROW_NUMBER() OVER ( PARTITION BY ticker ORDER BY period_end_date DESC ) rn
    FROM "ANALYTICS"."vQUARTERLY_MASTER_MATERIALIZED" 
    --WHERE ticker = 'ACN' 
    ORDER BY ticker, period_end_date DESC
    ) q
ORDER BY ticker, period_end_date desc 

Actual result

Expected result

【问题讨论】:

    标签: postgresql group-by row-number


    【解决方案1】:

    我找到了一种使用模数的解决方法。此解决方案允许我对最近几个季度、随后的 4 个季度等的 eps_diluted 求和。详见解决方案截图。

    SELECT 
        * 
    FROM (
        SELECT 
            *,
            SUM(eps_diluted) OVER (PARTITION BY ticker ORDER BY rn ASC ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) AS sum_eps_diluted,
            1+ ((rn - 1) % 4) AS modulo
        FROM(
            SELECT 
                "PK",
                ticker,
                period_end_date,
                eps_diluted,
                ROW_NUMBER() OVER ( PARTITION BY ticker ORDER BY period_end_date DESC ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) rn
            FROM "ANALYTICS"."vQUARTERLY_MASTER_MATERIALIZED" 
            ORDER BY ticker, period_end_date DESC
            ) t1
        --WHERE 1+ ((rn - 1) % 4) = 1
        ORDER BY ticker, period_end_date desc ) t2
    WHERE modulo = 1
    

    Solution

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2010-11-05
      • 2011-10-02
      • 2012-04-24
      • 2015-01-31
      • 2012-03-17
      相关资源
      最近更新 更多