SQL-запрос: для каждой записи, где is_queue_empty = 1 и имя-очереди пусто, немедленно получить следующую запись по отметке времени, где… - PullRequest
0 голосов
/ 21 марта 2011

Как мы можем построить sql-запрос со следующим ограничением.

Для каждой записи, где is_queue_empty = 1 и имя-очереди пусто, получить немедленную следующую запись по отметке времени, где is_queue_empty = 0 и имя-очереди может или не может быть пустым для того же сеанса-id и request-id.

В таблице есть следующие столбцы:

session_id, request_id, queue_name, is_queue_empty, отметка времени, queue_tag, tab_name.

То, что я имею далеко, это то, что неверно:

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 )

1 Ответ

2 голосов
/ 21 марта 2011
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
...