1

以下のようなデータを持つテーブルがあります

  Emp  Date        Code     
  ---  --------    ---- 
  E1  11/1/2012    W 
  E1  11/1/2012    V   
  E2  11/1/2012    W   
  E1  11/2/2012    W
  E1  11/3/2012    W
  E1  11/4/2012    W
  E1  11/5/2012    W

出力の日付範囲を使用して、コード W で 5 日間連続して働いた日付範囲 (過去 3 か月間など) の従業員のリストを取得したいと考えています。各従業員は、異なるコードを持つ 1 日の複数のレコードを持つことができます。

期待される出力は

Emp   Date-Range 
---   ----------
 E1   11/1 -11/5

以下は私が試したものですが、私が求める出力にはまったく近づきませんでした

 SELECT distinct user, MIN(date) startdate, MAX(date) enddate
FROM (SELECT user, date, (TRUNC(date) - ROWNUM) tmpcol
      FROM (SELECT user, date
              FROM tablename
             where date between to_date('10/01/2012','mm/dd/yyyy') and to_date('10/03/2012','mm/dd/yyyy')
             ORDER BY user, date) ot) t
 GROUP BY user, tmpcol
 ORDER BY user, startdate;

Emp E1 が連続して 10 日間勤務した場合、彼は両方の日付範囲で出力に 2 回リストされるはずです。E1 が連続して 9 日間 (11/1 から 11/9) 働いた場合、彼は 11/1 から 11/9 の日付範囲で 1 回だけリストされます。

私はすでに似たような質問を見てきましたが、どれも正確にはうまくいきませんでした。私のデータベースは Oracle 10G で、PL/SQL はありません。

4

4 に答える 4

3

ここから始めることができます:

select 
emp, count(*) over (partition by emp, code order by date_worked range interval '5' day preceding) as days_worked_last_5_days
from table
where code='W';

days_worked_last_5_days=5 の行が検索対象です。

このフィドルを参照してください。

于 2013-01-25T14:56:30.360 に答える
2

すべてを正しく理解できたかどうかはわかりませんが、次のようなものから始めることができます。

select emp, 
       sum(diff) as days,
       to_char(min(workdate), 'yyyy-mm-dd') as work_start,
       to_char(max(workdate), 'yyyy-mm-dd') as work_end
from (       
  select *
  from (
    select emp, 
           workdate, 
           code, 
           nvl(workdate - lag(workdate) over (partition by emp, code order by workdate),1) as diff
    from tablename
    where code = 'W'
     and workdate between ...
  ) t1
  where diff = 1 -- only consecutive rows
) t2
group by emp
having sum(diff) = 5

SQLFiddle: http://sqlfiddle.com/#!4/ad7ae/3

予約語を列名として使用するのは悪い考えであるため、workdate代わりに使用したことに注意してください。date

于 2013-01-25T14:45:07.077 に答える
0
Select emp, data-5, data from (SELECT EMP, DATA, WORK,lag, lead, row_number() over(PARTITION BY emp--, DATA 
ORDER BY DATA asc) rn
  FROM (SELECT emp,
               data,
               work,
               LAG (data) OVER (PARTITION BY emp ORDER BY data ASC) LAG,
               LEAD (data) OVER (PARTITION BY emp ORDER BY data ASC) LEAD
          FROM (SELECT emp,
                       data,
                       work,
                       ROW_NUMBER ()
                           OVER (PARTITION BY emp, data ORDER BY data ASC)
                           rn
                  FROM example)
         WHERE rn = 1) a
WHERE a.data + 1 = LEAD AND a.data - 1 = LAG
) WHERE rn = 5

テーブルの例は次のとおりです。

EMP(varchar2)、日付、「W」または「F」

于 2013-01-25T16:06:32.917 に答える