:(UIで「表示オプション」の下に「使用レガシーSQLを」オフ)standard SQLを有効にした後、あなたは、この例を実行することができます確立されたユーザーでさえ常に100%優れているとは限りません(非常に近い)。
Dudu Markovitzの回答は素晴らしいですが、残念ながら、(少なくとも私が質問をどのように理解したかによると)それはまだ間違っています。私が思う
task_id start_time end_time
a 1 10
aa 1 2
aaa 1 8
b 2 5
c 5 15
d 8 13
e 12 20
f 21 30
: - 一例として、結果
「タスクを実行している」ので、これらのタスクは間違って持っている - あなたは複数のタスクが同じのstart_timeで開始しているとき、それは正しくない場合がある例の下に考えますあなたの代わりに下記の
task_id start_time end_time running_tasks
a 1 10 1
aa 1 2 2
aaa 1 8 3
b 2 5 3
c 5 15 3
d 8 13 3
e 12 20 3
f 21 30 1
を取得します - あなたはドゥドゥのコードでそれをしようとする場合
task_id start_time end_time running_tasks
a 1 10 3 # a,aa,aaa
aa 1 2 3 # a,aa,aaa
aaa 1 8 3 # a,aa,aaa
b 2 5 3 # a,aaa,b (aa has ended)
c 5 15 3 # a,aaa,c (b has ended)
d 8 13 3 # a,c,d (aaa has ended)
e 12 20 3 # c,d,e (a has ended)
f 21 30 1 # f (c,d,e have ended)
:、あなたは結果の下に期待します3210
あなたはタスクaとaaの結果が間違っています。
理由は、RANGE UNBOUNDED PRECEDING
の代わりにROWS UNBOUNDED PRECEDING
を使用しているためです - 小さくても非常に重要なニュアンスです!
問合せは、あなたに正しい結果が得られますので、下に
SELECT task_id,start_time,end_time,running_tasks
FROM (
SELECT
task_id, tm, op, start_time, end_time,
SUM(op) OVER (ORDER BY tm ,op RANGE UNBOUNDED PRECEDING) AS running_tasks
FROM (
SELECT
task_id, start_time AS tm, 1 AS op, start_time, end_time
FROM tasks UNION ALL
SELECT
task_id, end_time AS tm, -1 AS op, start_time, end_time
FROM tasks
) t
)t
WHERE op = 1
ORDER BY start_time
簡単な要約:
ROWS UNBOUNDED PRECEDING - 窓枠を設定します - 行位置に基づいて、窓枠が
RANGEはUNBOUNDED PRECEDINGは
に対し設定行の値に基づいて
再び - エリオットが言及したように、これはJOINの概念よりもはるかに複雑です。しかし、それは価値があります。 Window Frame ClauseとROWS vs RANGEの詳細については、
Dudu、ありがとうスマートソリューションを参照してください。ウィンドウ関数を現在の行で調整できる、より一般化されたソリューションを得ることを望んでいました - これは可能ですか? –
@NewDev、私はあなたの意図を得ないので、例を挙げてください。 –
現在の行に対して条件を満たす行のみをカウントするために、条件付きのウィンドウ関数をCOUNTすることは可能ですか?たとえば、現在の行の 'start_time = 8'の場合、window関数は' end_time> 8 'と 'start_time <= 8'の行だけをカウントできますか? –