1

我正在研究移植一些包含像这样的窗口不同计数的 bigquery 遗留 sql

count(distinct brand_id) over (partition by user_id order by order_placed_at range between 7 * 24 * 60 * 60 * 1000000 PRECEDING AND 1 PRECEDING) as last_7_day_buyer_brands

到标准 sql .... 但我收到此错误....

Window ORDER BY is not allowed if DISTINCT is specified

作为参考,我尝试过APPROX_COUNT_DISTINCT没有运气的功能。

除了编写子查询和分组依据之外,还有更好的方法可以让它工作吗?

大多数其他查询都已移植到标准 sql 中,只进行了微小的更改。

4

1 回答 1

9

根据文档

OVER 子句要求:

分区方式:可选。
订购方式:可选。如果存在 DISTINCT,则不允许。
window_frame_clause:可选。如果存在 DISTINCT 则不允许

注意:上面是我“突出显示”的,而不是文档中的

正如您所看到的,使用时ORDER BY甚至RANGE BETWEEN是不允许的DISTINCT

我认为,子查询是要走的路。

如果您需要这方面的指导,请使用以下简单示例

#standardSQL
SELECT
  user_id,
  order_placed_at,
  brand_id,
  (SELECT COUNT(DISTINCT brand) 
      FROM UNNEST(last_7_day_buyer_brands_with_dups) AS brand
  ) AS last_7_day_buyer_brands
FROM (
  SELECT 
    user_id,
    order_placed_at,
    brand_id,
    ARRAY_AGG(brand_id) OVER(
      PARTITION BY user_id ORDER BY order_placed_at 
      RANGE BETWEEN 7 * 24 * 60 * 60 * 1000000 PRECEDING AND 1 PRECEDING
    ) AS last_7_day_buyer_brands_with_dups
  FROM yourTable
)
于 2017-03-02T23:18:26.677 回答