【问题标题】:how to replicate row_number in BigQuery BI engine如何在 BigQuery BI 引擎中复制 row_number
【发布时间】:2020-08-26 16:51:56
【问题描述】:

我有这个在 BigQuery 中运行良好的查询

WITH
  tt AS (
  SELECT
    StationName,
    SUM(Mwh) AS Mwh
  FROM
    `datastudio.today_view_MT`
  GROUP BY
    1)
SELECT
  StationName,
  Mwh,
  ROW_NUMBER() OVER(ORDER BY Mwh DESC ) AS rnk
FROM
  tt

但截至 2020 年 8 月,BI 引擎不加速分析功能,如何使用自联接或类似的方式重写相同的查询,以便 BI 引擎加速。

我的真实用例,查询使用Data Studio的参数,所以我无法具体化结果,有三个参数,所以有很多不同的组合。

【问题讨论】:

    标签: google-bigquery google-data-studio


    【解决方案1】:

    根据要求,这似乎可行:

    WITH
      tt AS (
      SELECT
        "A" AS fixed_value,
        StationName,
        SUM(Mwh) AS Mwh
      FROM
        `datastudio.today_view_MT`
      GROUP BY
        1, 2)
    SELECT
      tt.StationName,
      tt.Mwh,
      COUNT(*) AS row_number
    FROM
      tt
    JOIN
      tt tt2
    ON
      tt2.fixed_value = tt.fixed_value
      AND tt2.Mwh <= tt.Mwh
    GROUP BY
      tt.fixed_value,
      tt.Mwh,
      tt.StationName
    ORDER BY
      row_number
    

    请注意,您可能有重复的行号

    【讨论】:

      【解决方案2】:

      我尝试过使用连接,但我从来没有得到正确的结果,所以这是我的开箱即用解决方案:

      WITH
        tt AS (
        SELECT
          StationName,
          SUM(Mwh) AS Mwh
        FROM
          `datastudio.today_view_MT`
        GROUP BY
          1),
        structs AS (
        SELECT
          STRUCT(StationName,
            Mwh) AS station_struct
        FROM
          tt ),
        combinations AS (
        SELECT
          ARRAY_AGG(station_struct) AS stations,
          GENERATE_ARRAY(1,(
            SELECT
              COUNT(*)
            FROM
              tt)) AS numbers
        FROM
          structs )
      SELECT
        station.StationName,
        station.Mwh,
        numbers[
      OFFSET
        (stations_offset)] AS number
      FROM
        combinations,
        UNNEST(stations) AS station
      WITH
      OFFSET
        AS stations_offset
      

      现在的问题是你能在 BI 引擎中使用 generate_arrays 和 offsets 吗?

      【讨论】:

      • 不支持 UNNEST :(
      • 这就是我的加入:WITH tt AS ( SELECT "A" AS fixed_value, StationName, SUM(Mwh) AS Mwh FROM `datastudio.today_view_MT` GROUP BY 1) SELECT tt.StationName, tt.Mwh, COUNT(*) AS row_number FROM tt JOIN tt tt2 ON tt2.fixed_value = tt.fixed_value AND tt2.Mwh &lt;= tt.Mwh GROUP BY tt.fixed_value, tt.Mwh, tt.StationName ORDER BY row_number
      • 但是在我的数据集上我得到了重复的行号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多