Выбор окна записей - PullRequest
       1

Выбор окна записей

3 голосов
/ 29 февраля 2012

Рассмотрим следующую (простую) таблицу:

ID           NUMBER
PROD_NO      VARCHAR2(10)
START_TIME   DATE

Что я хочу сделать, так это выбрать «окно» строк размером n вокруг заданного START_TIME.

Пример:

ID   PROD_NO   START_TIME
...
42   1234567   2012-02-28 13:42:10
43   1234568   2012-02-28 13:47:53
44   1234569   2012-02-28 13:52:22
45   1234570   2012-02-28 13:59:01
46   1234571   2012-02-28 14:02:12
47   1234572   2012-02-28 14:05:19
... 

При условии START_TIME = '2012-02-28 14:00:00' и размера окна n = 4 результирующий набор строк должен иметь идентификатор 44 ... 47.

Нельзя считать, что записи отсортированы START_TIME. Если записей недостаточно для соответствия указанному размеру окна, оно может быть обрезано.

Поскольку мои навыки работы с SQL довольно ограничены, любая помощь будет принята с благодарностью.

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Вы можете использовать аналитические функции, чтобы помочь с этим:

select WT.ID
  from (select WT.ID
              ,max(
                 START_TIME)
               over (order by START_TIME
                     rows between 2 preceding and 2 following)
                 as MAXST
              ,min(
                 START_TIME)
               over (order by START_TIME
                     rows between 2 preceding and 2 following)
                 as MINST
          from WT) WT
 where MINST < to_date('2012-02-28 14:00:00', 'yyyy-mm-dd hh24:mi:ss')
       and MAXST > to_date('2012-02-28 14:00:00', 'yyyy-mm-dd hh24:mi:ss')
3 голосов
/ 29 февраля 2012

Теперь это должно работать:

SELECT *
FROM   (SELECT id, 
               prod_no, 
               start_time, 
               ROWNUM rn,
               datediff
        FROM   (SELECT   id,
                         prod_no,
                         start_time,
                         start_time
                         - TO_DATE('01-JAN-2011 12:00:00',
                                   'DD-MON-YYYY HH:MI:SS AM')
                            datediff
                FROM     table
                WHERE    start_time
                         - TO_DATE('01-JAN-2011 12:00:00',
                                   'DD-MON-YYYY HH:MI:SS AM') > 0
                ORDER BY datediff))
WHERE  rn <= 2
UNION ALL
SELECT *
FROM   (SELECT id, 
               prod_no, 
               start_time, 
               ROWNUM rn,
               datediff
        FROM   (SELECT   id,
                         prod_no,
                         start_time,
                         start_time
                         - TO_DATE('01-JAN-2011 12:00:00',
                                   'DD-MON-YYYY HH:MI:SS AM')
                            datediff
                FROM     table
                WHERE    start_time
                         - TO_DATE('01-JAN-2011 12:00:00',
                                   'DD-MON-YYYY HH:MI:SS AM') <= 0
                ORDER BY datediff DESC))
WHERE  rn <= 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...