[英]How to compare column in one table with array from another table in BigQuery?
[英]How do I insert multiple rows from one table into a struct column of a single row of another table?
我現在有 2 個源表。
表 #1:sourceTableMain
|EmployeeNumber| DepartmentNumber | CostCenterNumber |
| -------------| ---------------- |------------------|
| 1 | 100 | 1001 |
| 2 | 200 | 1001 |
| 3 | 100 | 1002 |
表 #2:sourceTableEmployee
|EmployeeNumber| EmployeeFirstName | EmployeeLastName | EmployeeAddress |
| -------------| ---------------- |------------------|---------------- |
| 1 | Michael | Scott | 110 ABC Ln |
| 1 | Michael | Scott | 450 XYZ Ln |
| 2 | Dwight | Schrute | 321 PQR St |
| 3 | Jim | Halpert | 678 LMN Blvd |
我正在嘗試將合並的行插入到名為targetTableCombined的第三個表中,該表具有以下架構:
字段名 | 類型 | 模式 | |
---|---|---|---|
員工編號 | INTEGER | 可空 | |
員工詳情 | (結構) | 記錄 | 重復 |
員工名字 | 細繩 | 可空 | |
員工姓氏 | 細繩 | 可空 | |
員工地址 | 細繩 | 可空 |
在目標表 (targetTableCombined) 中,我試圖確保對於每個 employeeNumber,所有名字、姓氏和地址都在單個結構數組下重復。 例如,EmployeeNumber 1 在目標表中應該只有 1 行,名字、姓氏和不同的地址作為第二列(結構)的一部分,每個都在單獨的行中。
我寫了一個插入腳本來做到這一點,但我錯了:
insert into `dev.try_sbx.targetTableCombined`
select
main.employeeNumber,
array(
select as struct
emp.employeeFirstName,
emp.employeeLastName,
emp.employeeAddress
)
from
`dev.try_sbx.sourceTableMain` as main
inner join `dev.try_sbx.sourceTableEmployee` as emp
on main.EmployeeNumber = emp.EmployeeNumber;
這是我在運行上面的查詢時得到的結果:
| EmployeeNumber | EmployeeDetails |
| ------------- | ------------------------------ |
| 1 | [Michael, Scott, 110 ABC Ln] |
| 1 | [Michael, Scott, 450 XYZ Ln] |
| 2 | [Dwight, Schrute, 321 PQR St] |
| 3 | [Jim, Halpert, 678 LMN Blvd] |
(很抱歉無法共享屏幕截圖 - 我沒有足夠的代表。但要詳細說明,我希望插入只有 3 行(員工 1 應該有一個包含兩個地址的數組)。相反,我正在獲取插入后 4 行。)
我的腳本哪里出錯了?
這是因為ARRAY()
不是聚合 function。您應該將ARRAY_AGG()
與GROUP BY
一起將每個員工的詳細信息分組到一個數組中。
SELECT EmployeeNumber,
ARRAY_AGG((SELECT AS STRUCT EmployeeFirstName, EmployeeLastName, EmployeeAddress)) AS employeeDetails
FROM `dev.try_sbx.sourceTableEmployee`
GROUP BY 1;
更優選的方式是:
SELECT EmployeeNumber,
ARRAY_AGG(STRUCT(EmployeeFirstName, EmployeeLastName, EmployeeAddress)) AS employeeDetails
FROM `dev.try_sbx.sourceTableEmployee`
GROUP BY 1;
output:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.