1

すでに解決されたQ( Oracle SQL:4時間で数える? )に関するフォローアップの質問が1つあります。

提示されたデータサンプルに別の列、金額の列がある場合、ソリューションで提案されているのと同じようにすべてやりたい

select t.*, 
from (select t.*, lag(dt, 6) over (partition by employeeId order by dt) as ord6dt
      from t
     ) t
where dt - ord6dt < 4.0/24

、金額列の1つの追加条件の合計> 10?

したがって、クエリには、4時間以内に6件の注文があった人だけをリストする必要がありますsum(order_value)>10

4

1 に答える 1

2

あなたが持っている解決策はちょうど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

于 2013-03-13T13:52:27.380 に答える