Учитывая таблицу, как показано ниже: созданный - TIMESTAMP (6), а ID - NUMBER (20,0)
| ID | CREATED | ...
| 1 | 2019-11-01 14:19:28.611000 | ...
| 2 | 2019-11-01 14:19:28.680000 | ...
Определите все строки, в которых CREATED
даты не соответствуют возрастающим значениям идентификатора.
Если значения упорядочены по идентификатору, любое CREATED
< предыдущее СОЗДАННОЕ значение.
Я попытался это сделать и обнаружил, что моя версия ужасно работает и не возвращает результатов. Я уверен, что мне не хватает эффективности в запросе.
В качестве вывода мне нужен ID/СОЗДАН строк, которые не соответствуют шагу.
кажется, вам нужна аналитическая функция lead()
для сравнения строки следующего уровня с текущей, и если она больше текущей, то она придет к вам на вывод
with cte as
(
select id,CREATED,lead(CREATED) over(order by id) as NR
from t
) select id,created from cte where CREATED>NR
Используя ROW_NUMBER()
, вы можете генерировать номера заказов по ID
и CREATED
, а затем сопоставлять их друг с другом:
select *
from (select t.*,
row_number() over(order by id) as id_order,
row_number() over(order by created, id) as created_order
from t)
where id_order <> created_order
Для created_order
я сортирую как по created
, так и по id
на тот случай, если created
содержит повторяющиеся значения.
Этот запрос вернет все затронутые строки. Например, для таких данных:
| ID | CREATED | ...
| 1 | 2019-11-01 14:19:28.611000 | ...
| 2 | 2019-11-01 14:19:28.680000 | ...
| 3 | 2019-11-01 14:19:28.612000 | ...
| 4 | 2019-11-01 14:19:28.613000 | ...
| 5 | 2019-11-01 14:19:28.681000 | ...
| 6 | 2019-11-01 14:19:28.681000 | ...
запрос вернет строки 2, 3 и 4.
что вы хотите в качестве вывода, пожалуйста, укажите это в описании