SELECT SUM(DECODE(EVENT, 'IN', 1, 0)) - SUM(DECODE(EVENT, 'OUT', 1, 0)) COUNT_PERSON
  FROM TABLE_DEMO
 WHERE EVENT_TIME < '2006-03-13 15:00:00'

解决方案 »

  1.   

    人物    事件    时间
    小王   进公园   2006-03-13 10:00:00
    小王   出公园   2006-03-03 18:00:00
    小明   进商场   2006-03-13 19:00:00
    (例如: 2006-03-13 15:00:00 )还在公园里的人员select 人物
      from temp
    where 事件 in ('进公园','出公园')
      and 时间 <= to_date(2006-03-13 15:00:00,'yyyy-mm-dd hh24:mi:ss')
    group by 人物
    having nvl(max(decode(事件,'出公园',时间)),date'3000-01-01')>max(decode(事件,'进公园',时间))
      

  2.   

    to tian00weiwei(weiwei)having nvl(max(decode(事件,'出公园',时间)),date'3000-01-01')>max(decode(事件,'进公园',时间))能解释下上面的语句什么意思吗?
      

  3.   

    select 人物
      from temp
    where 事件 in ('进公园','出公园')
      and 时间 <= to_date(2006-03-13 15:00:00,'yyyy-mm-dd hh24:mi:ss')
    group by 人物
    having nvl(max(decode(事件,'出公园',时间)),to_date(2006-03-13 15:00:00,'yyyy-mm-dd hh24:mi:ss'))<=max(decode(事件,'进公园',时间))
    decode(事件,'出公园',时间)的意思是如果事件为‘出公园’,那么这个表达式的值为所对应的时间,如果事件不是‘出公园’,那么返回默认值,但由于未定默认值,所以返回null,decode(事件,'进公园',时间)同样处理
    现在用time代替decode(事件,'出公园',时间),用time2代替decode(事件,'进公园',时间)
    max(time)我就不解释了,那么nvl(max(time),to_date(2006-03-13 15:00:00,'yyyy-mm-dd hh24:mi:ss'))的意思就是说如果没有‘出公园’的事见,那么就返回'2006-03-13 15:00:00',不然就返回max(time)
    最后having nvl(max(time),'3000-01-01')>max(time2)的意思是出公园的时间小于进公园的时间的记录才符合条件,或者未出公园,所以用2006-03-13 = 进公园时间也是符合条件的