[英]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.