0

次のようなデータを含むOracleテーブルがあります。

ID | ステータス| 時間
-------------------------------
 1 | IN | 2013/26/03 00:00
 1 | アウト| 2013/26/03 07:00
 1 | IN | 2013/27/03 03:00
 2 | IN | 2013/26/03 01:00
 2 | アウト| 2013/26/03 06:00
 3 | IN | 2013/26/03 01:30
        。
        。

STATUSはチェックインとチェックアウトを表し、IDは個人を表します。

サブクエリを使用してクエリを作成しましたが、エレガントで非効率的なようです。各IDの経過時間(IN-> OUT)を計算するために、単一のクエリ(サブクエリがないことを意味する)を作成することは可能ですか?

更新:また、個人がOUTである経過時間を表示することは可能ですか?たとえば、上記のデータでは、個人#1は7時間INですが、20時間OUTです(2013/27/03 03:00-2013 / 26/03 07:00)。これはレコード全体で計算されるため、これをどのように書き込むことができるかわかりません。

4

1 に答える 1

2

これを試して

select timein.id, 24 * (timeout.time - timein.time) ElapsedTime
from t timein 
left outer join t timeout on timein.id = timeout.id
where timein.status = 'IN' and timeout.status = 'OUT'

時間フィールドがcharデータ型の場合は、これを行う必要があります

select timein.id, 24 * (TO_DATE(timeout.time, 'YYYY-DD-MM hh24:mi') 
                      - TO_DATE(timein.time, 'YYYY-DD-MM hh24:mi')) ElapsedTime
from t timein 
left outer join t timeout on timein.id = timeout.id
where timein.status = 'IN' and timeout.status = 'OUT'

時間のある日のためにこれを試してみてください

select timein.id, NUMTODSINTERVAL((timeout.time - timein.time),'day') ElapsedTime
from t timein 
left outer join t timeout on timein.id = timeout.id
where timein.status = 'IN' and timeout.status = 'OUT'

インタイムとアウトタイムの場合、これを使用してデータに応じて変更できます

with cte as
(
select t.id, status,
24 * (t.time - LAG(t.time) 
  OVER (partition by id ORDER BY t.time)) AS diff
from t
)
select t1.id, t1.diff timeIn, t2.diff timeOut
from cte t1
LEFT OUTER JOIN
cte t2 on t1.id = t2.id  and t2.status = 'IN' and t2.diff is not null
where t1.status = 'OUT'
于 2013-03-26T17:39:17.950 に答える