【问题标题】:Partition By 2 Columns in BigQueryBigQuery 中按 2 列分区
【发布时间】:2020-11-18 14:52:56
【问题描述】:

假设我想对每个单位的前3个月的收入和收入金额进行排名,我可以执行以下没有问题:

Select * FROM (SELECT Flat,
EXTRACT(YEAR FROM pay_day) AS Year,
EXTRACT(MONTH FROM pay_day) AS Month,
RANK() OVER(PARTITION BY Flat ORDER BY SUM(USD_amt) DESC) AS rank, 
SUM(USD_amt) AS Revenue
FROM `finances.reservations` AS f
GROUP BY Flat, Year, Month)
WHERE rank<=3 AND Flat IS NOT NULL
ORDER BY Flat, Year, Rank, Month 
ASC

结果

   Flat Year Month Rank Revenue
    1   2019    12  1   3281
    1   2019    4   2   3031
    1   2020    7   3   3019
    1A  2020    11  1   1805
    1A  2020    9   2   1178
    1A  2020    5   3   1166
    2   2020    1   1   3419
    2   2020    7   2   2644
    2   2021    1   3   2460
    3   2019    10  3   2466
    3   2020    6   1   2558
    3   2020    1   2   2530
    4   2020    7   1   0

但是现在说我想要每个单位每年的前 3 个月,我想我只需要按年修改分区如下:

RANK() OVER(PARTITION BY Flat, EXTRACT(YEAR FROM pay_day) ORDER BY SUM(USD_amt) DESC) AS rank

我预计结果是这样的:

   Flat Year Month Rank Revenue
    1   2019    12  1   3281
    1   2019    4   2   3031
    1   2019    1   3   2031
    1   2020    4   1   3031
    1   2020    9   2   3001
    1   2020    7   3   2919

但这会导致错误“PARTITION BY expression references column pay_day which is not grouped or aggregated at [4:50]”我想知道我做错了什么?

表架构如下:

Field name            | Type    | Mode
----------------------+---------+------------
Flat                  | STRING  | NULLABLE
pay_day               | DATE    | NULLABLE
nights                | INTEGER | NULLABLE
check_in              | DATE    | NULLABLE
check_out             | DATE    | NULLABLE
nights__in_month_     | STRING  | NULLABLE
nights_outside_month_ | STRING  | NULLABLE
cleaning              | INTEGER | NULLABLE
currency              | STRING  | NULLABLE
USD_amt               | INTEGER | NULLABLE
EANR                  | STRING  | NULLABLE
name                  | STRING  | NULLABLE
people                | INTEGER | NULLABLE
country               | STRING  | NULLABLE
reservation_no_       | STRING  | NULLABLE
payment_processor     | STRING  | NULLABLE
Check_in_day          | STRING  | NULLABLE
Cleaner               | STRING  | NULLABLE
Review                | STRING  | NULLABLE

【问题讨论】:

    标签: sql google-bigquery ranking-functions


    【解决方案1】:

    我认为您可以在 BigQuery 中引用列别名:

    SELECT *
    FROM (SELECT Flat, EXTRACT(YEAR FROM pay_day) AS Year,
                 EXTRACT(MONTH FROM pay_day) AS Month,
                 RANK() OVER (PARTITION BY Flat, Year ORDER BY SUM(USD_amt) DESC) AS rank, 
                 SUM(USD_amt) AS Revenue
          FROM `finances.reservations` AS f
          GROUP BY Flat, Year, Month
         ) ym
    WHERE rank <= 3 AND Flat IS NOT NULL
    ORDER BY Flat, Year, Rank, Month ASC
    

    如果没有,你可以使用:

    RANK() OVER (PARTITION BY Flat, EXTRACT(YEAR FROM MIN(pay_day))
                 ORDER BY SUM(USD_amt) DESC
                ) AS rank, 
    

    GROUP BY 范围内的最小日期是同一年,所以这实际上是相同的。我意识到这就是我通常解决这个问题的方式。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2021-10-05
      • 1970-01-01
      • 2023-03-12
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多