OH.看见了交易类型(进出站区分,SORRY

解决方案 »

  1.   


    select  max(decode(rownum,1, (case when 交易类型为空 then  空  else 交易时间 end 进站交易时间)))--进站时间
    group by 卡号
    order by 交易类型  --假设1为进 2为出
      

  2.   


    with TB as
     (select 交易时间,
             交易设备号,
             乘客卡号,
             交易类型,
             票卡类型,
             线路编号,
             交易站点,
             lead(交易时间) over(order by 交易时间 nulls last) 下次时间,
             lead(交易类型) over(order by 交易时间 nulls last) 下次交易类型,
             lead(交易站点) over(order by 交易时间 nulls last) 下次交易地点,
             lead(交易设备号) over(order by 交易时间 nulls last) 下次交易设备号
        from 详细交易表)
    select 乘客卡号,
           票卡类型,
           交易时间 进站交易时间,
           交易设备号 进站设备号,
           交易站点 进站站点,
           decode(下次交易类型, '出站', 下次时间, NULL) 出站交易时间,
           decode(下次交易类型, '出站', 交易设备号, NULL) 出站设备号,
           decode(下次交易类型, '出站', 下次交易地点, NULL) 出站站点
      from TB
     where 交易类型 = '进站'
      

  3.   

    WITH T1 AS
    (SELECT 1 S_TIME,'I' TYP FROM DUAL UNION ALL
    SELECT 2 S_TIME,'I' TYP FROM DUAL UNION ALL
    SELECT 3 S_TIME,'O' TYP FROM DUAL UNION ALL
    SELECT 4 S_TIME,'O' TYP FROM DUAL UNION ALL
    SELECT 5 S_TIME,'I' TYP FROM DUAL UNION ALL
    SELECT 6 S_TIME,'O' TYP FROM DUAL UNION ALL
    SELECT 7 S_TIME,'I' TYP FROM DUAL UNION ALL
    SELECT 8 S_TIME,'O' TYP FROM DUAL UNION ALL
    SELECT 9 S_TIME,'I' TYP FROM DUAL 
    )
    SELECT T.S_TIME,T.TYP,decode(END_typ,'I',NULL,T.END_TYP) END_TYP,DECODE(T.END_TYP,'I',0,t.end_time) END_TIME
      FROM (SELECT T1.*,
                   LEAD(TYP) OVER(ORDER BY S_TIME) END_TYP,
                   LEAD(S_TIME) OVER(ORDER BY S_TIME) END_TIME
              FROM T1) T
     WHERE T.TYP = 'I'
     UNION ALL
     SELECT NULL,NULL,T.TYP,T.S_TIME
      FROM (SELECT T1.*,
                   LAG(TYP) OVER(ORDER BY S_TIME) END_TYP,
                   LAG(S_TIME) OVER(ORDER BY S_TIME) END_TIME
              FROM T1) T
     WHERE T.TYP = 'O'
     AND T.END_TYP='O';
      

  4.   

    谢谢各位老师,还有点看不懂,我先学习一下lead over这个函数的用法!
      

  5.   


    with TB as
     (select 交易时间,
             交易设备号,
             乘客卡号,
             交易类型,
             票卡类型,
             线路编号,
             交易站点,
             lead(交易时间) over(order by 交易时间 nulls last) 下次时间,
             lead(交易类型) over(order by 交易时间 nulls last) 下次交易类型,
             lead(交易站点) over(order by 交易时间 nulls last) 下次交易地点,
             lead(交易设备号) over(order by 交易时间 nulls last) 下次交易设备号,
             lag(交易类型) over(order by 交易时间 nulls last) 上次交易类型
        from tmp_z)
    select 乘客卡号,
           票卡类型,
           decode(交易类型, '进站', 交易时间, NULL) 进站交易时间,
           decode(交易类型, '进站', 交易设备号, NULL) 进站设备号,
           decode(交易类型, '进站', 交易站点, NULL) 进站站点,
           decode(交易类型, '出站', 交易时间, decode(下次交易类型, '出站', 下次时间, NULL)) 出站交易时间,
           decode(交易类型, '出站', 交易设备号, decode(下次交易类型, '出站', 交易设备号, NULL)) 出站设备号,
           decode(交易类型, '出站', 交易站点, decode(下次交易类型, '出站', 下次交易地点, NULL)) 出站站点
      from TB
     where 交易类型 = '进站'
        or (交易类型 = '出站' and nvl(上次交易类型, 'A') <> '进站') 
      

  6.   

    能解释一下( lead(交易时间) over(order by 交易时间 nulls last) 下次时间 )的意思吗
      

  7.   


    with tb as    
    (select '2013-11-01 10:08:20' x from dual union all
    select '2013-11-01 10:08:21' from dual union all
    select '2013-11-01 10:08:22' from dual union all
    select '2013-11-01 10:08:23' from dual union all
    select '2013-11-01 10:08:24' from dual
    )
    select 
    X,
    LAG(X) over(ORDER BY X) 上次时间,
    LEAD(X) over(ORDER BY X) 下次时间
    from TB
      

  8.   

    snbxp,你好!上面的查询是按照同一卡号进出站对应得出的记录吗?哪段代码把同一卡号的进出站匹配查出来了,我看完代码的理解是,不一定是同一卡号,只要进站后下一个出站,不管卡号是不是一个,都生成一条记录。是不是我理解的有问题,资质较差,还望老师指点呀!
      

  9.   

    如果要按照同一卡号的话,需要用partition by 乘客卡号lead(交易时间) over(partition by 乘客卡号 order by 交易时间 nulls last) 下次时间