Сделайте это с одним SQL - PullRequest
1 голос
/ 02 октября 2008

У меня есть таблица, которая выглядит так:

alt text

Строки отсортированы по CLNDR_DATE DESC.

Мне нужно найти CLNDR_DATE, который соответствует выделенной строке, другими словами:
Найдите самую верхнюю группу строк, ГДЕ EFFECTIVE_DATE НЕ ПУСТО, и вернуть CLNR_DATE последней строки этой группы.

Обычно я открывал курсор и циклически работал сверху вниз, пока не нашел NULL в EFFECTIVE_DATE. Тогда я бы знал, что искомая дата - CLNDR_DATE, полученная на предыдущем шаге.

Однако мне интересно, можно ли добиться того же с помощью одного SQL?

Ответы [ 4 ]

7 голосов
/ 02 октября 2008

Предупреждение: ни в коем случае не администратор базы данных. ;)

Но, быстрый, непроверенный удар:

SELECT min(CLNDR_DATE) FROM [TABLE]
WHERE (EFFECTIVE_DATE IS NOT NULL)
  AND (CLNDR_DATE > (
    SELECT max(CLNDR_DATE) FROM [TABLE] WHERE EFFECTIVE_DATE IS NULL
  ))

Предполагая, что вы хотите первый CLNDR_DATE с EFFECTIVE_DATE после последнего без .

Если вы хотите, чтобы сначала с после сначала без , измените подзапрос, чтобы использовать min () вместо max ().

1 голос
/ 02 октября 2008

Использование аналитической функции Oracle (не проверено)

select *
from
(
  select 
    clndr_date, 
    effective_date, 
    lag(clndr_date, 1, null) over (order by clndr_date desc) prev_clndr_date
  from table
)
where effective_date is null

lag(clndr_date, 1, null) over (order by clndr_date desc) возвращает предыдущую дату clndr_date или использует null, если это первая строка.

(редактировать: фиксированный порядок)

0 голосов
/ 02 октября 2008

Когда вы находитесь в среде Oracle, вы можете использовать аналитические функции (http://www.orafaq.com/node/55),, которые являются очень мощными инструментами для выполнения запросов, которые вы запрашиваете.

Используя стандартный SQL, я думаю, что это невозможно, но, возможно, некоторые гуру SQL покажут какое-то хорошее решение.

0 голосов
/ 02 октября 2008

Первый результат из этого набора записей - это то, что вы ищете. В зависимости от вашей базы данных вы можете вернуть эту строку только с помощью LIMIT или TOP

SELECT CLNDR_DATE 
FROM TABLE
WHERE CLNDR_DATE > (SELECT MAX(CLNDR_DATE)
                    FROM TABLE 
                    WHERE EFFECTIVE_DATE IS NOT NULL)
ORDER BY CLNDR_DATE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...