SQL: Как я могу выбрать записи таблицы в течение следующих трех доступных дат? - PullRequest
1 голос
/ 29 сентября 2011

Чтобы уточнить вопрос далее ...

У меня есть следующая таблица ORDERS_TAB с некоторыми примерами информации:

|Order| Launch_Date |
|  1  |   27-Sep-11 |
|  2  |   29-Sep-11 |
|  3  |   30-Sep-11 |
|  4  |   03-Oct-11 |
|  5  |   28-Oct-11 |
|  8  |   10-Oct-11 |
|  7  |   29-Sep-11 |

Я хочу выбрать все ордеров, которыеиметь значение LAUNCH_DATE в течение следующих трех доступных дней, включая текущий день.Итак, сегодня, 29 сентября, три таблицы из трех доступных дат будут 29 сентября, 30 сентября, 11 октября и 11 октября.Таким образом, запрос вернет результат:

|Order| Launch_Date |
|  2  |   29-Sep-11 |
|  3  |   30-Sep-11 |
|  4  |   03-Oct-11 |
|  7  |   29-Sep-11 |

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

Все, что я ищу, - это простое утверждение SELECT с некоторыми условиями, но любая помощь очень ценится,

Спасибо-вы.:)

Ответы [ 6 ]

7 голосов
/ 29 сентября 2011
SELECT
  *
FROM
(
  SELECT
    DENSE_RANK() OVER (ORDER BY Launch_Date) available_date_index,
    *
  FROM
    ORDERS_TAB
  WHERE
    Launch_Date >= TRUNC(Sysdate)
)
WHERE
  available_date_index <= 3


РЕДАКТИРОВАТЬ Поскольку существует путаница в отношении того, как работает DENSE_RANK (), вот пример OP ...

|Order| Launch_Date |    Available_Date_Index
|  1  |   27-Sep-11 | <excluded by WHERE clause>
|  2  |   29-Sep-11 |             1
|  3  |   30-Sep-11 |             2
|  4  |   03-Oct-11 |             3
|  5  |   28-Oct-11 |             5
|  8  |   10-Oct-11 |             4
|  7  |   29-Sep-11 |             1

Это означает, что возвращенные заказы будут 2,3,4,7.Точно так же, как описано в ОП.

3 голосов
/ 29 сентября 2011
select * from ORDERS_TAB where Launch_Date in
   (select Launch_Date from
          (select distinct Launch_Date from ORDERS_TAB
                  where Launch_Date >= '2011-09-29' order by Launch_Date)
    WHERE rownum <= 3)
0 голосов
/ 29 сентября 2011

Редактировать: Как отмечают комментарии, следующее не работает, может быть, пойти для

SELECT * FROM ORDERS_TAB WHERE LaunchDate IN (
  SELECT TOP(3) LaunchDate FROM ORDERS_TAB ((possibly WHERE LaunchDate > GETDATE()?))
  ORDER BY LaunchDate DESC )
0 голосов
/ 29 сентября 2011
select * from order_tab where launch_date in
(    
  select launchdate
    from
    (
      select launchdate from order_tab
      where launch_date >= SysDate -- Check this
      order by launch_date
    )  where rownum <= 3
)

Как это выглядит?

0 голосов
/ 29 сентября 2011

SELECT * FROM ORDERS_TAB, где Launch_Date между '29 -sep-11 'и ADDDATE (' 2007-09-01 ', 3);попробуйте это, надеюсь, это поможет вам.

0 голосов
/ 29 сентября 2011

Попробуйте это:

SELECT * FROM ORDERS_TAB WHERE sysdate - launch_date <= 3
...