当您按某些列分组时,您需要确保将一些聚合函数应用于其余列。否则你会得到你在问题中显示的错误
试试下面的 BigQuery 标准 SQL 示例
#standardSQL
SELECT
customers.orderCustomerEmail AS email,
ARRAY_AGG(STRUCT(customers.orderCustomerNumber AS customerNumber,
customers.billingFirstname AS billingFirstname,
customers.billingLastname AS billingLastname)) AS info
FROM `dim_customers`, UNNEST(customers) AS customers
GROUP BY email
或者只是简单的 DISTINCT
#standardSQL
SELECT DISTINCT
customers.orderCustomerEmail AS email,
customers.orderCustomerNumber AS customerNumber,
customers.billingFirstname AS billingFirstname,
customers.billingLastname AS billingLastname
FROM `dim_customers`, UNNEST(customers) AS customers
请注意:就您期望的确切输出而言,您的问题不够具体,因此上面很可能需要对您的特定需求进行一些调整
更新
我基本上需要每个客户一行(电子邮件是唯一标识符,因此是组)详细信息(号码,名字,姓氏)可以从最后一个条目中获取,例如
#standardSQL
WITH `dim_customers` AS (
SELECT [
STRUCT('a' AS orderCustomerEmail, 1 AS orderCustomerNumber, 'af' AS billingFirstname, 'al' AS billingLastname),
STRUCT('a' AS orderCustomerEmail, 4 AS orderCustomerNumber, 'af1' AS billingFirstname, 'al2' AS billingLastname),
STRUCT('b' AS orderCustomerEmail, 2 AS orderCustomerNumber, 'bf' AS billingFirstname, 'bl' AS billingLastname),
STRUCT('c' AS orderCustomerEmail, 3 AS orderCustomerNumber, 'cf' AS billingFirstname, 'cl' AS billingLastname)
] AS customers UNION ALL
SELECT [
STRUCT('a' AS orderCustomerEmail, 1 AS orderCustomerNumber, 'af' AS billingFirstname, 'al' AS billingLastname),
STRUCT('a' AS orderCustomerEmail, 4 AS orderCustomerNumber, 'af1' AS billingFirstname, 'al2' AS billingLastname),
STRUCT('b' AS orderCustomerEmail, 2 AS orderCustomerNumber, 'bf' AS billingFirstname, 'bl' AS billingLastname),
STRUCT('c' AS orderCustomerEmail, 3 AS orderCustomerNumber, 'cf' AS billingFirstname, 'cl' AS billingLastname)
] AS customers
)
SELECT
customers.orderCustomerEmail AS email,
ARRAY_AGG(STRUCT(customers.orderCustomerNumber AS customerNumber,
customers.billingFirstname AS billingFirstname,
customers.billingLastname AS billingLastname))[OFFSET(0)] AS info
FROM `dim_customers`, UNNEST(customers) AS customers
GROUP BY email
更新
以下是更新的架构!
dim_customer 架构:
orderCustomerEmail:STRING,
billingFirstname:STRING,
billingLastname:STRING,
orderCustomerNumber:STRING,
OrderNumber:STRING
#standardSQL
WITH `dim_customers` AS (
SELECT 10201 AS orderCustomerNumber, 'a@email.com' AS orderCustomerEmail, 'Alex' AS billingFirstname, 'Miller' AS billingLastname UNION ALL
SELECT 10202, 'b@email.com', 'Ben', 'Williams' UNION ALL
SELECT 10203, 'c@email.com', 'Chris', 'Collins' UNION ALL
SELECT 10204, 'd@email.com', 'David', 'Hems' UNION ALL
SELECT 10201, 'a@email.com', 'A.', 'Miller' UNION ALL
SELECT 10201, 'a@email.com', 'A.', 'Miller' UNION ALL
SELECT 10202, 'b@email.com', 'Ben', 'Williams' UNION ALL
SELECT 10202, 'b@email.com', 'Bens Father', 'Williams' UNION ALL
SELECT 10205, 'a@email.com', 'A.', 'Miller' UNION ALL
SELECT 10206, 'e@email.com', 'Ed', 'Winchell'
)
SELECT info.* FROM (
SELECT
orderCustomerEmail AS email,
ARRAY_AGG(STRUCT(
orderCustomerEmail AS email,
orderCustomerNumber AS customerNumber,
billingFirstname AS billingFirstname,
billingLastname AS billingLastname))[OFFSET(0)] AS info
FROM `dim_customers`
GROUP BY email
)
-- ORDER BY email