簡體   English   中英

BigQuery:標量子查詢產生了不止一個 - 將日期時間聚合到時間間隔中的數組

[英]BigQuery : Scalar Subquery produced more than one - aggregating datetime to array in time interval

我正在嘗試查找在特定時間間隔(每行不同的間隔)中發生的事件,並將其添加為一列。 最后附上的兩個表:(1)時間間隔,(2)日期時間事件

首先,我為每一行添加了一個包含所有數據時間事件的列作為數組。 例子

其次,我使用此代碼計算每個間隔中有多少個日期時間:

-- count how many urine-output chart-events for every hourly interval
SELECT T_PLUS, START_TIME_ROUNDED_UP, TIME_INTERVAL_STARTS, TIME_INTERVAL_FINISH,
sum((SELECT count(*) FROM UNNEST(twi.ca) as x WHERE x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH)) NUMBER_OF_OUTPUTS_IN_INTERVAL
FROM TIMES_WITH_INTERVALS twi
group by T_PLUS, START_TIME_ROUNDED_UP, TIME_INTERVAL_STARTS, TIME_INTERVAL_FINISH

當我嘗試添加另一列與間隔中出現的日期時間(在數組中)時,我得到:

標量子查詢產生了多個元素

這是我使用的代碼:

SELECT T_PLUS, START_TIME_ROUNDED_UP, TIME_INTERVAL_STARTS, TIME_INTERVAL_FINISH,
sum((SELECT count(*) FROM UNNEST(twi.ca) as x WHERE x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH)) NUMBER_OF_OUTPUTS_IN_INTERVAL,
ARRAY_AGG(FORMAT("%T",(SELECT * FROM UNNEST(twi.ca) as x WHERE x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH))) AS ARRAY_OF_TIMES_IN_INTERVALL
FROM TIMES_WITH_INTERVALS twi
group by T_PLUS, START_TIME_ROUNDED_UP, TIME_INTERVAL_STARTS, TIME_INTERVAL_FINISH

更大的圖景

我有一張帶有日期時間戳+體積測量的表格(最后的圖2)。 我想將測量的值聚合到舍入的時間間隔中,這意味着能夠對每個事件的測量值進行算術運算。

我對不同的方法持開放態度。

我想做的計算——總和:

  1. 對於時間間隔中的第一個測量事件:檢查原始表中前一次測量的日期時間戳的時間差是多少(以分鍾為單位),除以時間差中的值,將其乘以從一開始的時間差的區間。
  2. 時間間隔內的所有其他測量事件:只需將它們添加到總和中。
  3. 間隔后的第一次測量:與第一次測量的邏輯相同,但將補碼部分添加到總和中。

我的終極解決方案

感謝 Gordon Linoff 的大力幫助,我能夠正確運行我的代碼。 當我繼續處理“更大的圖片”時,我需要一個對未嵌套的 arra 具有更多可變性的解決方案——最終將 Gordon Linoff 解決方案與 CASE 結合起來:

SELECT *,
      COUNT(case when x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH then uo.charttime end) AS NUMBER_OF_OUTPUTS_IN_INTERVAL,
      ARRAY_AGG(case when x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH then uo.charttime end IGNORE NULLS) AS ARRAY_OF_TIMES_IN_INTERVALL,
      ARRAY_AGG(case when x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH then uo.value end IGNORE NULLS) AS ARRAY_OF_UO,
      ARRAY_REVERSE(ARRAY_AGG(case when x <= twi.TIME_INTERVAL_STARTS then x end IGNORE NULLS))[OFFSET(0)] AS TIME_BEFORE,
      ARRAY_AGG(case when x > twi.TIME_INTERVAL_FINISH then x end IGNORE NULLS)[OFFSET(0)] AS TIME_AFTER,
      ARRAY_AGG(case when x > twi.TIME_INTERVAL_FINISH then uo.value end IGNORE NULLS)[OFFSET(0)] AS UO_AFTER,
FROM TIMES_WITH_INTERVALS twi 
      LEFT JOIN UNNEST(twi.ca) x
      ON true
      LEFT JOIN uo
      ON uo.charttime = x
GROUP BY T_PLUS, START_TIME_ROUNDED_UP, TIME_INTERVAL_STARTS, TIME_INTERVAL_FINISH
ORDER BY T_PLUS

原表截圖:

  1. 時間間隔
  2. 日期時間事件

format()array_agg()放在子查詢中:

(SELECT ARRAY_AGG(FORMAT('%T', x))
 FROM 
 WHERE x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH
) AS ARRAY_OF_TIMES_IN_INTERVAL

也就是說,我很不清楚為什么要將時間戳轉換為字符串以存儲在數組中。 您可以只擁有一個本機類型的數組。

編輯:

您的查詢應該如下所示:

SELECT T_PLUS, START_TIME_ROUNDED_UP, TIME_INTERVAL_STARTS, TIME_INTERVAL_FINISH,
       COUNT(x) as cnt,
       ARRAY_AGG(x) as timestamps
FROM TIMES_WITH_INTERVALS twi LEFT JOIN
     UNNEST(twi.ca) x
     ON x BETWEEN twi.TIME_INTERVAL_STARTS AND twi.TIME_INTERVAL_FINISH
GROUP BY T_PLUS, START_TIME_ROUNDED_UP, TIME_INTERVAL_STARTS, TIME_INTERVAL_FINISH;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM