あなたが持っている解決策はちょうど6行を振り返ります(これは4時間前に満足した最初の注文ではないかもしれません)。したがって、そのソリューションを維持する別の分析を追加します。
select *
from (select t1.*, lag(dt, 6) over (partition by employee order by dt) as ord6dt,
sum(order_value) over (partition by employee order by dt rows 6 preceding) val
from emptest t1
)
where dt - ord6dt < 4.0/24
and val >= 10;
ここでも6行しかカウントされません(過去4時間に6を超える注文があった場合、実際の一致を見逃す可能性があります)。
代わりにこれをモデル化できます。
select *
from (select *
from emptest
model
dimension by (employee, dt)
measures ( order_value, order_id, 0 order_sum, 0 number_of_orders)
rules (
order_sum[any,any] = sum(order_value)[cv(employee), dt between cv(dt)-(4/24) and cv(dt)],
number_of_orders[any,any] = count(*)[cv(employee), dt between cv(dt)-(4/24) and cv(dt)]
))
where order_sum > 10
and number_of_orders >= 6
order by employee, dt;
これは、4以上のnumber_of_ordersを検索し、4時間にわたるカウントもチェックします。
フィドル:http ://sqlfiddle.com/#!4 / 3045d / 1