100Mポイントデータセットのビッグクエリとヒットタイムアウトにはまったく新しいものがあります。私は0(停止)の周りの一貫した一連の値に達する点と、一貫して0(開始)を超える点を見つけることを試みています。ビッグクエリアナリティック関数はクエリパフォーマンスを向上させます
開始ファイルの時刻を決定するサブクエリが、それ自身のデータセットに保存されていましたが、それは役に立ちませんでした。 (秒は、複数の経由インクリメント「ファイル。」
問題を引き起こし部分が前のPTSと次のPTSの初期集合体である。私が保存しようとした
違いを生むだろう
WITH test AS
(SELECT 'A' as ACM, CAST('2017-01-01' AS DATE) as file_date, CAST('10:10:10' AS TIME) as file_time , 0.0 as value, 0.1 as seconds
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', 0, 0.2 #start
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', 2000, 0.3
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', 1000, 0.4
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', 0, 0.5
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', -1000, 0.6
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', -2000, 0.7
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', 0, 0.8 #stop
UNION ALL SELECT 'A', '2017-01-01', '10:10:10', 0, 0.9
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 0, 1.0 #start
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 1000, 1.1
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 1000, 1.2
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 2000, 1.3
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 0, 1.4
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 0, 1.5
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', -1000, 1.6
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', -2000, 1.7
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 0, 1.8
UNION ALL SELECT 'A', '2017-01-01', '10:10:11', 1000, 1.9
UNION ALL SELECT 'A', '2017-01-01', '10:10:12', 2000, 2.0
UNION ALL SELECT 'A', '2017-01-01', '10:10:12', 1000, 2.1
UNION ALL SELECT 'A', '2017-01-01', '10:10:12', 0, 2.2 #stop
UNION ALL SELECT 'A', '2017-01-01', '10:10:12', 20, 2.3
UNION ALL SELECT 'A', '2017-01-01', '10:10:12', 0, 2.4
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', 0, 0.1
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', 0, 0.2 #start
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', 2000, 0.3
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', 1000, 0.4
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', 0, 0.5
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', -1000, 0.6
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', -2000, 0.7
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', 0, 0.8 #stop
UNION ALL SELECT 'B', '2017-01-01', '10:10:10', 0, 0.9
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 0, 1.0 #start
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 1000, 1.1
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 1000, 1.2
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 2000, 1.3
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 0, 1.4
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 0, 1.5
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', -1000, 1.6
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', -2000, 1.7
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 0, 1.8
UNION ALL SELECT 'B', '2017-01-01', '10:10:11', 1000, 1.9
UNION ALL SELECT 'B', '2017-01-01', '10:10:12', 2000, 2.0
UNION ALL SELECT 'B', '2017-01-01', '10:10:12', 1000, 2.1
UNION ALL SELECT 'B', '2017-01-01', '10:10:12', 0, 2.2 #stop
UNION ALL SELECT 'B', '2017-01-01', '10:10:12', 20, 2.3
UNION ALL SELECT 'B', '2017-01-01', '10:10:12', 0, 2.4)
SELECT
acm,
file_date,
start_file_time,
file_times,
agg_sec as start_stop
FROM (
SELECT
acm,
file_date,
start_file_time,
file_times,
ARRAY_AGG(kind) OVER w AS agg_kind,
ARRAY_AGG(seconds) OVER w AS agg_sec
FROM (
SELECT
acm,
file_date,
start_file_time,
ARRAY(SELECT DISTINCT x FROM UNNEST(file_times) as x) AS file_times,
seconds,
CASE
WHEN (ABS(prev_val) < 50 and ABS(next_val) >= 50 and next_avg >= 50 and prev_avg < 50) THEN 'start'
WHEN (ABS(next_val) < 50 and ABS(prev_val) >= 50 and prev_avg >= 50 and next_avg < 50) THEN 'stop'
END as kind,
prev_val, next_val, prev_avg, next_avg
FROM (
SELECT
s.acm as acm,
s.file_date as file_date,
s.start_file_time as start_file_time,
seconds,
value,
ARRAY_AGG(s.file_time) OVER (PARTITION BY s.acm, s.file_date, s.start_file_time) as file_times,
AVG(ABS(value)) OVER prev as prev_avg,
NTH_VALUE(value, 2) OVER prev as prev_val,
AVG(ABS(value)) OVER next as next_avg,
NTH_VALUE(value, 2) OVER next as next_val
FROM test v
JOIN (
SELECT
acm,
file_date,
file_time,
TIME_SUB(file_time, INTERVAL CAST(FLOOR(MIN(seconds)) AS INT64) SECOND) as start_file_time
FROM test
GROUP BY acm, file_date, file_time
) s ON s.acm = v.acm AND s.file_date = v.file_date AND s.file_time = v.file_time
WINDOW prev AS (PARTITION BY s.acm, s.file_date, s.start_file_time ORDER BY seconds ROWS 2 PRECEDING), next AS (PARTITION BY s.acm, s.file_date, s.start_file_time ORDER BY seconds ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)
)
WHERE value = 0)
WHERE kind IN ('start', 'stop')
WINDOW w AS (PARTITION BY acm, file_date, start_file_time ORDER BY seconds ROWS 1 PRECEDING))
WHERE ARRAY_LENGTH(agg_kind) = 2 AND agg_kind[ORDINAL(1)] = 'start' AND agg_kind[ORDINAL(2)] = 'stop'
;
あなたの投稿のサンプルコードは**正しい結果**を生成しますが、実際のデータに適用するとタイムアウトしますか? –
SOの重要な点 - 投稿された回答の左側にある投票の下にあるチェックマークを使って、「受け入れられた回答をマークする」ことができます。重要な理由については、http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235を参照してください。答えに投票することも重要です。役に立った答えを投票してください。 ...誰かがあなたの質問に答えるときに何をすべきかを調べることができます - http://stackoverflow.com/help/someone-answers。これらの単純なルールに従えば、あなた自身の評判スコアを上げると同時に、私たちはあなたの質問に答えるために動機づけることができます:o)考慮してください! –