2011-03-21 52 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