【问题标题】:How to identify last row in partition without using two window functions?如何在不使用两个窗口函数的情况下识别分区中的最后一行?
【发布时间】:2022-08-18 16:15:42
【问题描述】:

我有三个级别的分组:idcategorysubcategory,带有一个名为 order_key 的顺序键。

我想根据是否达到每个 (id, category, subcategory) 的最后一行来应用条件逻辑。我现在的逻辑是这样的:

SELECT 
    id
  , category
  , subcategory
  , CASE
      WHEN ROW_NUMBER() OVER (PARTITION BY id, category, subcategory 
      ORDER BY order_key) 
         = COUNT(order_key) OVER (PARTITION BY id, category, subcategory)
            THEN -- execute logic #1
      ELSE 
         -- execute logic #2
    END
      AS result
FROM my_table

我在更长的查询中使用了上面的代码,但它导致了这个错误,所以我希望通过不使用尽可能多的窗口函数来更好地优化它:Resources exceeded during query execution. The query could not be executed in the allotted memory. Peak usage: 133% of limit. Top memory consumer: OVER() clauses: 100%.

有没有办法通过只用一个或 0 个窗口函数更改 CASE WHEN 语句来更有效地解决这个问题?

    标签: sql database group-by google-bigquery aggregate-functions


    【解决方案1】:

    找到了一种使用 1 个窗口函数的方法。有没有更有效的选择?

    SELECT 
        id
      , category
      , subcategory
      , CASE
          WHEN LAST_VALUE(order_key) OVER (PARTITION BY id, category, subcategory 
          ORDER BY order_key) = order_key
             THEN -- execute logic #1
          ELSE 
             -- execute logic #2
        END
          AS result
    FROM my_table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2011-03-16
      相关资源
      最近更新 更多