2011-03-21 51 views
-1

我们如何使用以下约束来构建sql查询。有关sql查询的帮助

对于is_queue_empty = 1且queue_name为空的每条记录,通过timestamp获取紧接的下一条记录,其中is_queue_empty = 0且queue_name可以或不能为同一会话标识和请求标识为空。

表具有以下的列:

SESSION_ID,REQUEST_ID,queue_name,is_queue_empty,时间戳,queue_tag,TAB_NAME。

我有dofar是这是不正确的:

SELECT x.tab_name, 
     x.is_queue_empty, 
     x.SESSION_ID, 
     x.request_ID, 
     x.TO_CHAR(DATETIME, 'YYYY/MM/DD HH24:MI:SS') timestamp, 

     y.tab_name,y.queue_name,y.is_queue_empty 

FROM queue_data AS x 
WHERE 
     timesttamp < TO_DATE('2011/02/30') 
     AND timestamp >= TO_DATE('2011/01/01') 

     AND is_queue_empty=1 

    AND timestamp < (select TO_CHAR(timestamp, 'YYYY/MM/DD HH24:MI:SS') as timestamp from queue_data as Y where x.session_id = y.session_id and x.request_id=y.request_id and y.is_queue_empty=0 order by y.timestamp asc limit 1) 
+0

to_char?这是Oracle还是MySQL? – RichardTheKiwi 2011-03-21 08:41:26

+0

oracle.You是对的 – TopCoder 2011-03-21 08:43:55

+0

好,我写的好东西和符合ANSI的交叉dbms答案然后 – RichardTheKiwi 2011-03-21 08:54:12

回答

2
select a.session_id,a.request_id,a.timestamp,a.queue_tag, 
    b.* 
from 
(
    select session_id,request_id,timestamp,queue_tag, 
    (select min(b.timestamp) 
     from tbl b 
     where a.session_id=b.session_id 
     and a.request_id=b.request_id 
     and b.timestamp > a.timestamp 
     and b.is_queue_empty=0) nextrec 
    from tbl a 
    where is_queue_empty=1 and nullif(queue_name,'') is null 
) a 
left join tbl b on a.session_id=b.session_id 
       and a.request_id=b.request_id 
       and a.nextrec = b.timestamp 

注:

  1. tbl是表
  2. 假设时间戳的名称SESSION_ID内是独一无二的, request_id组合
+0

感谢您的帮助总是。你是真正的MySql大师。 – TopCoder 2011-03-21 09:03:36

+0

我收到“ORA-00907:缺少右括号”与此查询错误。我们可以在oracle中选择这样的列吗? – TopCoder 2011-03-21 17:53:36

+0

@TopCoder我在子查询外移动了'nextrec'列别名。不靠近甲骨文如此未经测试,但它看起来应该工作。 – RichardTheKiwi 2011-03-21 19:08:32