表结构如下
NUM VARCHAR2(14) N
FJOBID VARCHAR2(10) N
FLSTUPDTIME DATE N sysdate
FCREATETIME DATE N sysdate
FORDER VARCHAR2(20) N
FSTORE VARCHAR2(8) N
FPICKER INTEGER Y
FPATH VARCHAR2(4) Y
FPICKAREA VARCHAR2(4) N
FARTICLENUMBER INTEGER N
FARTICLECOUNTSTR VARCHAR2(15) N
STAT INTEGER N
FCATEGORY VARCHAR2(10) N
单号 作业号       更新时间          线路   门店      区域
num             fjobid          FLSTUPDTIME             FORDER   FSTORE         FPICKER
90760610290001 0610290001 2006-10-29 10:25:28 A00-01  0312 30 30
90760610290002 0610290001 2006-10-29 10:35:11 A00-02  0323 30 30
90760610290003 0610290001 2006-10-29 10:50:28 A00-04  0385 30 30
90760610290004 0610290001 2006-10-29 11:05:14 A00-05  0517 30 30
......
90760610290420 0610290001 2006-10-29 22:20:02 AAA-01 1248 30 30          
.......
90760610300462 0610300001      2006-10-30 14:15:16 B22-05   0590 30 30
......
                0807010001      2008-07-01 14:15:16     ...................................
fjonid是一天下个作业号,现在想求员工工作时间小时数,以jobid来代表每一天,每天作业号的更新时间第一条记录的时间是开工时间,最后一条记录的时间是完成时间,本来我计算上班时间是用(MAX(FLSTUPDTIME)-min(FLSTUPDTIME))*24来求出小时数,
但发现一个问题,例如工作时间是从早上9点开始,到晚上11点结束,就可以(MAX(FLSTUPDTIME)-min(FLSTUPDTIME))*24用计出小时数,但如果一天的工作时间超过了12点,最后一记录的更新时间就会是第二天的00点,这样就有点题,我想知道按作业号来取出取后一条记录的时间数减去第一条记录的时间数,这样才可以求出一天的工作小时数....原来我是这样做出来
select * to_char(FLSTUPDTIME,'yy-mm-dd' ),fjobid,fpickuparea,min(FLSTUPDTIME ),max(FLSTUPDTIME ),(MAX(FLSTUPDTIME)-min(FLSTUPDTIME))*24
from tpikcup
where fjobid between '0610010001' and '0610310001'
group by fjobid,fpickuparea
要取出第天作业号的第一条记录时间数和最后一记录的时间应如何取法

解决方案 »

  1.   

    几种方法
    分组后取max 最后条纪录,min第一条纪录
    或者用first_value和last_value这两个分析函数
      

  2.   

    oracle 不确定列的行列转换
    http://topic.csdn.net/u/20080416/11/910e40c1-60f1-441f-8b0f-19a969d30f77.html
      

  3.   

    first_value和last_value请问一下使用方法是怎样
      

  4.   

    2楼我贴错地方了
    Determine the First Value / Last Value of a Group确定组中的第一个值/最后一个值
    The FIRST_VALUE and LAST_VALUE functions allow you to select the first and last rows from a group. These rows are especially valuable because they are often used as the baselines in calculations. FIRST_VALUE与LAST_VALUE函数可以选择一组中的第一行和最后一行。这些行很有用,因为它们经常用作计算的基线。
    Example例
    The following example selects, for each employee in each department, the name of the employee with the lowest salary. 下例为每个部门的每名员工、最高工资员工的姓名。
    break on deptno skip 1SELECT deptno, ename, sal, 
      FIRST_VALUE(ename)
      OVER (PARTITION BY deptno
            ORDER BY sal ASC) AS MIN_SAL_HAS
    FROM emp
    ORDER BY deptno, ename;
        DEPTNO ENAME             SAL MIN_SAL_HAS
    ---------- ---------- ---------- -----------
            10 CLARK            2450 MILLER
               KING             5000 MILLER
               MILLER           1300 MILLER        20 ADAMS            1100 SMITH
               FORD             3000 SMITH
               JONES            2975 SMITH
               SCOTT            3000 SMITH
               SMITH             800 SMITH        30 ALLEN            1600 JAMES
               BLAKE            2850 JAMES
               JAMES             950 JAMES
               MARTIN           1250 JAMES
               TURNER           1500 JAMES
               WARD             1250 JAMES
    The following example selects, for each employee in each department, the name of the employee with the highest salary.下例中为每个部门的每名员工、最高工资员工的姓名。
    SELECT deptno, ename, sal, 
      FIRST_VALUE(ename)
      OVER (PARTITION BY deptno
            ORDER BY sal DESC) AS MAX_SAL_HAS
    FROM emp
    ORDER BY deptno, ename;
        DEPTNO ENAME             SAL MAX_SAL_HAS
    ---------- ---------- ---------- -----_-----
            10 CLARK            2450 KING
               KING             5000 KING
               MILLER           1300 KING        20 ADAMS            1100 FORD
               FORD             3000 FORD
               JONES            2975 FORD
               SCOTT            3000 FORD
               SMITH             800 FORD        30 ALLEN            1600 BLAKE
               BLAKE            2850 BLAKE
               JAMES             950 BLAKE
               MARTIN           1250 BLAKE
               TURNER           1500 BLAKE
               WARD             1250 BLAKE
    The following example selects, for each employee in department 30 the name of the employee with the lowest salary using an inline view下例为第30个部门中的每名员工、工资最低员工的姓名,使用内联视图。
    SELECT deptno, ename, sal,
      FIRST_VALUE(ename)
      OVER (ORDER BY sal ASC) AS MIN_SAL_HAS
    FROM (SELECT * FROM emp WHERE deptno = 30)
        DEPTNO ENAME             SAL MIN_SAL_HAS
    ---------- ---------- ---------- -----------
            30 JAMES             950 JAMES
               MARTIN           1250 JAMES
               WARD             1250 JAMES
               TURNER           1500 JAMES
               ALLEN            1600 JAMES
      

  5.   

    如何可以实现我的目的,要用last_value-first_value?
      

  6.   

    问题是:
    如果一个jobid 第一天上班 10点到第二天凌晨2点,
    然后第二天 12点到凌晨1点,
    就是说第一天的下班和第二天的上班都在同一天了,没看到你标记上下班的标志,就是说你没办法完全区分每一天这才是问题所在吧你首先要有一个规则确定一条记录到底是哪一天的然后用最后一条记录减最前一条记录,如果<0 加个24不就是当天的工作时间了,这个逻辑很好做
      

  7.   

    如果你第一个时间肯定是最小的,最后个时间肯定是最大的
    那用max-min是最方便的
    如果不是的话,就需要用last_value-first_value
      

  8.   

    如果下班时间是第二天1点,这样用MAX和MIN就取值取不准的