2013-02-20 20 views
1

我有許多記錄表的oracle 10g數據庫。 表中有員工收到某種訂單的數據。 最可用的列是員工,dt和orderId(我已附加示例)。 我想構建select將選擇在任何 4小時中有6個或更多訂單的員工的記錄。我使用了常規連接,各種功能,但我仍然沒有做出可用的選擇。 我無法對過去(4h)中的每個記錄搜索進行選擇,並查看同一員工是否有6個訂單。Oracle SQL:4小時計數?

任何幫助或溶液理解。

BR,

IJ

的選擇

http://sqlfiddle.com/#!2/77418/1

輸出應爲:

喬2013年2月19日13時28分09秒36589589

喬2013年2月19日13: 50:59 36589593

馬特·2013年2月19日13時57分02秒36589594

喬2013年2月19日14點19分46秒36589598

尼2013年2月19日14點50分28秒36589601

尼2013年2月19日14時54分58秒36589602

尼2013年2月19日14點56分35秒36589603

雷2013年2月19日15點26分39秒36589607

雷2013年2月19日15時26分41秒36589608

雷2013年2月19日15點26分44秒36589609

雷2013年2月19日15時48分11秒36589611

尼2013年2月19日16點48分52秒36589614

尼2013年2月19日16 :49:40 36589615

尼2013年2月19日16時50分38秒36589616

約翰尼2013年2月19日17點37分33秒36589620

約翰尼2013年2月19日17時51分41秒36589621

喬2013年2月19日18時16分55秒36589625

約翰尼2013年2月19日18點34分14秒36589626

馬特2013年2月19日21時13分50 36589632

+0

「任何4h」是什麼意思?我想不是最後4個小時,但如果你提供了樣本數據,它會更好。 – 2013-02-20 13:45:08

+0

我準備了圖片但無法上傳。 – 2013-02-20 13:46:46

+0

@ypercube:我懷疑OP想回答這個問題:「在2003-02-18 08:00和2003-02-18 12:00之間,哪些員工至少有6個訂單,*或2003-02-18 08之間:01 and 2003-02-18 12:01,* or * between 2003-02-18 08:02 and 2003-02-18 12:02,...「 – 2013-02-20 13:54:15

回答

3

您可以用lag()功能做到這一點:

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 

這只是看起來在6階前的電流和日期進行比較。只保留時間差小於4小時的行。

+0

:是否有可能對具有滯後函數的域進行求和?例如:如果在每一行附近還有另一個數字值爲coulmn,例如5 $,我想要列出所有在4小時內和sum(order_amount)> 10 $? – 2013-03-13 12:19:33

0

這樣的事情應該這樣做:

select distinct employee 
    from (select employee, dt, orderid, 
       (select count(*) 
        from emp_data ed2 
        where ed2.employee = ed.employee 
        and ed2.dt >= ed.dt 
        and ed2.dt <= ed.dt + (4/24)) cnt 
      from emp_data ed) 
where cnt >= 6; 

and ed2.dt < ed.dt + (4/24)更換and ed2.dt <= ed.dt + (4/24)如果你不想指望從09:00:00說 - 13:00:00但僅限於12:59:59。

+0

我想我們應該停止幫助,如果用戶不發佈結構,數據樣本和所需的輸出... – Art 2013-02-20 14:18:55

+0

@Art:我同意,但我無法添加圖片,由於名譽,所以現在我已經創建表和插入的行在小提琴上,希望它有助於描述我的問題 – 2013-02-20 15:28:09

+0

@Johnny - 我認爲你已經有兩個最好的答案...當使用ctrl + K發佈代碼時。 – Art 2013-02-20 16:00:20