英文:
How to Update a Struck with New Rows in GBQ with Standard SQL
问题
以下是代码部分的翻译:
我有以下表格:
WITH
source_data AS (
SELECT
1 AS client_id,
CAST('2022-10-13' AS DATE) AS session_date,
'denied' AS value,
UNION ALL
SELECT
1,
CAST('2022-10-15' AS DATE),
'granted'
UNION ALL
SELECT
1,
CAST('2022-10-18' AS DATE),
'denied'
UNION ALL
SELECT
2,
CAST('2022-01-01' AS DATE),
'denied'
UNION ALL
SELECT
2,
CAST('2022-01-05' AS DATE),
'granted'
UNION ALL
SELECT
3,
CAST('2022-01-01' AS DATE),
'granted'
UNION ALL
SELECT
4,
CAST('2022-01-03' AS DATE),
'granted'),
max_date AS (
SELECT
client_id,
session_date,
value
FROM
source_data )
SELECT
client_id,
MAX(session_date) AS last_activity,
ARRAY_AGG(STRUCT(session_date,
value)
ORDER BY
session_date) AS push_permission
FROM
max_date
GROUP BY
1
它看起来像这样:
[![进入图像描述][1]][1]
现在,我有另一个表格,为客户1和2创建新记录,就像您在图片中看到的那样:
WITH
source_data AS (
SELECT
1 AS client_id,
CAST('2023-05-08' AS DATE) AS session_date,
'denied' AS value,
UNION ALL
SELECT
2,
CAST('2023-05-08' AS DATE),
'granted'
),
max_date AS (
SELECT
client_id,
session_date,
value
FROM
source_data )
SELECT
client_id,
MAX(session_date) AS last_activity,
ARRAY_AGG(STRUCT(session_date,
value)
ORDER BY
session_date) AS push_permission
FROM
max_date
GROUP BY
1
[![进入图像描述][2]][2]
我想知道是否有办法将这些结果附加到第一个表格中的struct,就像这样:
[![进入图像描述][3]][3]
我尝试了INSERT,但它在表格中创建了新记录,而不是将它们附加到struct中。
我看了UPDATE,但我在文档中没有看到如何在STRUCT中使用它,只有在ARRAY中有说明。这是我尝试过的:
UPDATE
`table1`
SET
push_permission = ARRAY(
SELECT
push_permission
FROM
UNNEST(push_permission) AS push_permission
UNION ALL
SELECT
(CAST(CURRENT_DATE()-1 AS DATE),
push_permission.push_system_permission ))
WHERE client_id IN (SELECT
DISTINCT(client_id)
FROM
`table2`)
在GBQ中是否有办法做到这一点?
希望这可以帮助您理解代码部分的内容。如果您有其他问题或需要进一步的翻译,请告诉我。
英文:
I have the following table:
WITH
source_data AS (
SELECT
1 AS client_id,
CAST('2022-10-13' AS DATE) AS session_date,
'denied' AS value,
UNION ALL
SELECT
1,
CAST('2022-10-15' AS DATE),
'granted'
UNION ALL
SELECT
1,
CAST('2022-10-18' AS DATE),
'denied'
UNION ALL
SELECT
2,
CAST('2022-01-01' AS DATE),
'denied'
UNION ALL
SELECT
2,
CAST('2022-01-05' AS DATE),
'granted'
UNION ALL
SELECT
3,
CAST('2022-01-01' AS DATE),
'granted'
UNION ALL
SELECT
4,
CAST('2022-01-03' AS DATE),
'granted'),
max_date AS (
SELECT
client_id,
session_date,
value
FROM
source_data )
SELECT
client_id,
MAX(session_date) AS last_activity,
ARRAY_AGG(STRUCT(session_date,
value)
ORDER BY
session_date) AS push_permission
FROM
max_date
GROUP BY
1
It looks like this:
Now, I have another table that create new records for client 1 and 2, like you see in the picture:
WITH
source_data AS (
SELECT
1 AS client_id,
CAST('2023-05-08' AS DATE) AS session_date,
'denied' AS value,
UNION ALL
SELECT
2,
CAST('2023-05-08' AS DATE),
'granted'
),
max_date AS (
SELECT
client_id,
session_date,
value
FROM
source_data )
SELECT
client_id,
MAX(session_date) AS last_activity,
ARRAY_AGG(STRUCT(session_date,
value)
ORDER BY
session_date) AS push_permission
FROM
max_date
GROUP BY
1
I would like to know if there is any way to append these results inside the struct in the following way in the first table, like this:
I have tried with INSERT, but it is creating new records in the table, not appending them to the struct.
I have take a look to UPDATE, but I don't see in the documentation how to use it in STRUCT, only in ARRAY. This is what I tried:
UPDATE
`table1`
SET
push_permission = ARRAY(
SELECT
push_permission
FROM
UNNEST(push_permission) AS push_permission
UNION ALL
SELECT
(CAST(CURRENT_DATE()-1 AS DATE),
push_permission.push_system_permission ))
WHERE client_id IN (SELECT
DISTINCT(client_id)
FROM
`table2`)
Is there any way to do this in GBQ?
答案1
得分: 2
使用以下方法可能会有所帮助。
(你可以用以下查询的结果替换现有表)
```sql
WITH first_source_data AS (
-- 在此处放入你的第一个查询
),
second_source_data AS (
-- 在此处放入你的第二个查询
)
SELECT client_id,
MAX(last_activity) last_activity,
ARRAY_CONCAT_AGG(push_permission) push_permission
FROM (
SELECT * FROM first_source_data
UNION ALL
SELECT * FROM second_source_data
) GROUP BY 1;
查询结果
另请参阅
<details>
<summary>英文:</summary>
You might consider below approach.
(you can replace the existing table with the result of below query)
```sql
WITH first_source_data AS (
-- put your first query here
),
second_source_data AS (
-- put your second query here
)
SELECT client_id,
MAX(last_activity) last_activity,
ARRAY_CONCAT_AGG(push_permission) push_permission
FROM (
SELECT * FROM first_source_data
UNION ALL
SELECT * FROM second_source_data
) GROUP BY 1;
Query result
See also
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论