如何使用标准SQL在GBQ中更新带有新行的Struck。

huangapple go评论88阅读模式
英文:

How to Update a Struck with New Rows in GBQ with Standard SQL

问题

以下是代码部分的翻译:

  1. 我有以下表格:
  2. WITH
  3. source_data AS (
  4. SELECT
  5. 1 AS client_id,
  6. CAST('2022-10-13' AS DATE) AS session_date,
  7. 'denied' AS value,
  8. UNION ALL
  9. SELECT
  10. 1,
  11. CAST('2022-10-15' AS DATE),
  12. 'granted'
  13. UNION ALL
  14. SELECT
  15. 1,
  16. CAST('2022-10-18' AS DATE),
  17. 'denied'
  18. UNION ALL
  19. SELECT
  20. 2,
  21. CAST('2022-01-01' AS DATE),
  22. 'denied'
  23. UNION ALL
  24. SELECT
  25. 2,
  26. CAST('2022-01-05' AS DATE),
  27. 'granted'
  28. UNION ALL
  29. SELECT
  30. 3,
  31. CAST('2022-01-01' AS DATE),
  32. 'granted'
  33. UNION ALL
  34. SELECT
  35. 4,
  36. CAST('2022-01-03' AS DATE),
  37. 'granted'),
  38. max_date AS (
  39. SELECT
  40. client_id,
  41. session_date,
  42. value
  43. FROM
  44. source_data )
  45. SELECT
  46. client_id,
  47. MAX(session_date) AS last_activity,
  48. ARRAY_AGG(STRUCT(session_date,
  49. value)
  50. ORDER BY
  51. session_date) AS push_permission
  52. FROM
  53. max_date
  54. GROUP BY
  55. 1
  56. 它看起来像这样:
  57. [![进入图像描述][1]][1]
  58. 现在,我有另一个表格,为客户12创建新记录,就像您在图片中看到的那样:
  59. WITH
  60. source_data AS (
  61. SELECT
  62. 1 AS client_id,
  63. CAST('2023-05-08' AS DATE) AS session_date,
  64. 'denied' AS value,
  65. UNION ALL
  66. SELECT
  67. 2,
  68. CAST('2023-05-08' AS DATE),
  69. 'granted'
  70. ),
  71. max_date AS (
  72. SELECT
  73. client_id,
  74. session_date,
  75. value
  76. FROM
  77. source_data )
  78. SELECT
  79. client_id,
  80. MAX(session_date) AS last_activity,
  81. ARRAY_AGG(STRUCT(session_date,
  82. value)
  83. ORDER BY
  84. session_date) AS push_permission
  85. FROM
  86. max_date
  87. GROUP BY
  88. 1
  89. [![进入图像描述][2]][2]
  90. 我想知道是否有办法将这些结果附加到第一个表格中的struct,就像这样:
  91. [![进入图像描述][3]][3]
  92. 我尝试了INSERT,但它在表格中创建了新记录,而不是将它们附加到struct
  93. 我看了UPDATE,但我在文档中没有看到如何在STRUCT中使用它,只有在ARRAY中有说明。这是我尝试过的:
  94. UPDATE
  95. `table1`
  96. SET
  97. push_permission = ARRAY(
  98. SELECT
  99. push_permission
  100. FROM
  101. UNNEST(push_permission) AS push_permission
  102. UNION ALL
  103. SELECT
  104. (CAST(CURRENT_DATE()-1 AS DATE),
  105. push_permission.push_system_permission ))
  106. WHERE client_id IN (SELECT
  107. DISTINCT(client_id)
  108. FROM
  109. `table2`)
  110. GBQ中是否有办法做到这一点

希望这可以帮助您理解代码部分的内容。如果您有其他问题或需要进一步的翻译,请告诉我。

英文:

I have the following table:

  1. WITH
  2. source_data AS (
  3. SELECT
  4. 1 AS client_id,
  5. CAST('2022-10-13' AS DATE) AS session_date,
  6. 'denied' AS value,
  7. UNION ALL
  8. SELECT
  9. 1,
  10. CAST('2022-10-15' AS DATE),
  11. 'granted'
  12. UNION ALL
  13. SELECT
  14. 1,
  15. CAST('2022-10-18' AS DATE),
  16. 'denied'
  17. UNION ALL
  18. SELECT
  19. 2,
  20. CAST('2022-01-01' AS DATE),
  21. 'denied'
  22. UNION ALL
  23. SELECT
  24. 2,
  25. CAST('2022-01-05' AS DATE),
  26. 'granted'
  27. UNION ALL
  28. SELECT
  29. 3,
  30. CAST('2022-01-01' AS DATE),
  31. 'granted'
  32. UNION ALL
  33. SELECT
  34. 4,
  35. CAST('2022-01-03' AS DATE),
  36. 'granted'),
  37. max_date AS (
  38. SELECT
  39. client_id,
  40. session_date,
  41. value
  42. FROM
  43. source_data )
  44. SELECT
  45. client_id,
  46. MAX(session_date) AS last_activity,
  47. ARRAY_AGG(STRUCT(session_date,
  48. value)
  49. ORDER BY
  50. session_date) AS push_permission
  51. FROM
  52. max_date
  53. GROUP BY
  54. 1

It looks like this:

如何使用标准SQL在GBQ中更新带有新行的Struck。

Now, I have another table that create new records for client 1 and 2, like you see in the picture:

  1. WITH
  2. source_data AS (
  3. SELECT
  4. 1 AS client_id,
  5. CAST('2023-05-08' AS DATE) AS session_date,
  6. 'denied' AS value,
  7. UNION ALL
  8. SELECT
  9. 2,
  10. CAST('2023-05-08' AS DATE),
  11. 'granted'
  12. ),
  13. max_date AS (
  14. SELECT
  15. client_id,
  16. session_date,
  17. value
  18. FROM
  19. source_data )
  20. SELECT
  21. client_id,
  22. MAX(session_date) AS last_activity,
  23. ARRAY_AGG(STRUCT(session_date,
  24. value)
  25. ORDER BY
  26. session_date) AS push_permission
  27. FROM
  28. max_date
  29. GROUP BY
  30. 1

如何使用标准SQL在GBQ中更新带有新行的Struck。

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:

如何使用标准SQL在GBQ中更新带有新行的Struck。

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:

  1. UPDATE
  2. `table1`
  3. SET
  4. push_permission = ARRAY(
  5. SELECT
  6. push_permission
  7. FROM
  8. UNNEST(push_permission) AS push_permission
  9. UNION ALL
  10. SELECT
  11. (CAST(CURRENT_DATE()-1 AS DATE),
  12. push_permission.push_system_permission ))
  13. WHERE client_id IN (SELECT
  14. DISTINCT(client_id)
  15. FROM
  16. `table2`)

Is there any way to do this in GBQ?

答案1

得分: 2

  1. 使用以下方法可能会有所帮助。
  2. (你可以用以下查询的结果替换现有表)
  3. ```sql
  4. WITH first_source_data AS (
  5. -- 在此处放入你的第一个查询
  6. ),
  7. second_source_data AS (
  8. -- 在此处放入你的第二个查询
  9. )
  10. SELECT client_id,
  11. MAX(last_activity) last_activity,
  12. ARRAY_CONCAT_AGG(push_permission) push_permission
  13. FROM (
  14. SELECT * FROM first_source_data
  15. UNION ALL
  16. SELECT * FROM second_source_data
  17. ) GROUP BY 1;

查询结果

如何使用标准SQL在GBQ中更新带有新行的Struck。

另请参阅

  1. <details>
  2. <summary>英文:</summary>
  3. You might consider below approach.
  4. (you can replace the existing table with the result of below query)
  5. ```sql
  6. WITH first_source_data AS (
  7. -- put your first query here
  8. ),
  9. second_source_data AS (
  10. -- put your second query here
  11. )
  12. SELECT client_id,
  13. MAX(last_activity) last_activity,
  14. ARRAY_CONCAT_AGG(push_permission) push_permission
  15. FROM (
  16. SELECT * FROM first_source_data
  17. UNION ALL
  18. SELECT * FROM second_source_data
  19. ) GROUP BY 1;

Query result

如何使用标准SQL在GBQ中更新带有新行的Struck。

See also

huangapple
  • 本文由 发表于 2023年5月22日 21:03:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/76306493.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定