簡體   English   中英

如何申請:count(distinct ...) over (partition by ... order by) 在大查詢中?

[英]How to apply: count(distinct ...) over (partition by ... order by) in big query?

我目前有這個源表

我正在嘗試從 GCP BigQuery 上的 SQL 中的第一個表中獲取第二個表

我的查詢如下:

        SELECT
            SE.MARKET_ID,
            SE.LOCAL_POS_ID,
            SE.BC_ID,
            LEFT(SE.SALE_CREATION_DATE,6) AS DATE_ID_MONTH,

            COUNT(DISTINCT
                CASE
                    WHEN FLAG
                    THEN SE.CUST_ID
                END)
            OVER (PARTITION BY SE.MARKET_ID, SE.LOCAL_POS_ID, SE.BC_ID, LEFT(SE.SALE_CREATION_DATE,4) ORDER BY LEFT(SE.SALE_CREATION_DATE,6)) AS NB_ACTIVE_CUSTOMERS

        FROM
            SE
        GROUP BY
            SE.MARKET_ID, SE.LOCAL_POS_ID, SE.BC_ID, LEFT(SE.SALE_CREATION_DATE,6)

但是,我收到此錯誤,但未能成功繞過:

Window ORDER BY is not allowed if DISTINCT is specified at [12:107]

我無法使用以下請求創建以前的表:

SELECT DISTINCT
        SE.MARKET_ID,
        SE.LOCAL_POS_ID,
        SE.BC_ID,
        LEFT(SE.SALE_CREATION_DATE,6) AS DATE_ID_MONTH,
        CASE
            WHEN FLAG
            THEN SE.CUST_ID
            ELSE NULL
        END AS VALID_CUST_ID
FROM
        SE

為了在那之后使用dense_rank(),因為我有50 個其他指標(和500M 行)要添加到該表(基於其他標志的指標),而且我顯然無法為每個指標創建一個WITH,我需要只有幾個 WITH 或 none(就像我當前的查詢應該做的那樣)。

有沒有人知道我該如何處理?

您稍后提到使用dense_rank()dense_rank()也不適用於此計數器嗎?

DENSE_RANK(CASE WHEN FLAG = 1 THEN SE.CUST_ID END)
    OVER (
        PARTITION BY SE.MARKET_ID, SE.LOCAL_POS_ID, SE.BC_ID, LEFT(SE.SALE_CREATION_DATE, 4)
        ORDER BY LEFT(SE.SALE_CREATION_DATE, 6)
    ) AS NB_ACTIVE_CUSTOMERS

考慮以下方法

select * except(ids), 
  array_length(array(
    select distinct id
    from unnest(split(ids)) id
  )) as nb_active_customers, 
  format('%t', array(
    select distinct id
    from unnest(split(ids)) id
  )) as distinct_values
from (
  select market_id, local_pos_id, bc_id, date_id_month,
    string_agg('' || ids) over(partition by market_id order by date_id_month) ids
  from (
    select market_id, local_pos_id, bc_id, left(sale_creation_date,6) AS date_id_month,
      string_agg('' || cust_id) ids
    from se
    where flag = 1
    group by market_id, local_pos_id, bc_id, date_id_month
  )
) t          

如果應用於您問題中的樣本數據 - 輸出是

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM