如何为 postgresql 中查询的前 n 行分配唯一标识符?
How to assign a unique identifier to the first n rows of a query in postgresql?
在 postgres SQL 中,如何为查询的前 n 行分配唯一标识符 (rn?),并为后续的 n 行分配唯一标识符? objective 是按代码和唯一标识符分组,详情请参阅实际与预期屏幕截图。
实际查询
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
我找到了一个使用模数的解决方法。该解决方案允许我对最近几个季度、随后的 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
在 postgres SQL 中,如何为查询的前 n 行分配唯一标识符 (rn?),并为后续的 n 行分配唯一标识符? objective 是按代码和唯一标识符分组,详情请参阅实际与预期屏幕截图。
实际查询
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
我找到了一个使用模数的解决方法。该解决方案允许我对最近几个季度、随后的 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