ВЫБРАТЬ строку последнего обновления с тем же значением - PullRequest
0 голосов
/ 18 марта 2020

У нас есть эта таблица, которая продолжает вставлять значения поля Inrunning, которое является числом. Есть несколько ошибочных вставок. Я хочу получить строку, где произошла первая вставка с повторяющимся значением. В этом случае значение 5000 вставляется 3 раза в считанные минуты. Итак, я хочу получить первое вставленное значение, которое является строкой 3.

enter image description here

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Если вы используете Oracle DB 12c+, то вы можете использовать без необходимости использовать дополнительный подзапрос через предложение FETCH с параметром 1 ROW ONLY вместе с предложением ORDER BY, включая LEAD() analyti c функционирует как

LEAD(inrunningdelay_1) OVER ( PARTITION BY writer ORDER BY written_1 )

начиная со значения zero для

ABS( inrunningdelay_1 - LEAD(inrunningdelay_1) OVER ( PARTITION BY writer ORDER BY written_1 ) )

путем использования абсолютного значения для разности

SELECT t.*
  FROM t   
 ORDER BY ABS( inrunningdelay_1 - LEAD(inrunningdelay_1) 
                                  OVER ( ORDER BY written_1 ) )
 FETCH FIRST 1 ROW ONLY 

Демо

Обновление: PARTITION BY writer будет избыточным в вышеуказанном случае, так как это будет работать только для одного автора, как упомянул Теджа sh. Для нескольких писателей рассмотрим следующий оператор Select:

WITH t2 AS
(
  SELECT t.*, 
         ABS( inrunningdelay_1 - LEAD(inrunningdelay_1) 
             OVER ( PARTITION BY writer ORDER BY written_1 ) ) as ld            
    FROM t      
   ORDER BY writer, ld, written_1   
)
SELECT written_1, writer, inrunningdelay_1  
  FROM t2  
 ORDER BY ROW_NUMBER() OVER  ( PARTITION BY writer ORDER BY ld )
 FETCH FIRST 1 ROW WITH TIES

, где вы бы отфильтровали только zero возвращаемых значений, а затем выбрали бы only first возвращено для каждого автора с помощью функции ROW_NUMBER() analyti c в самом глубоком предложении ORDER BY:

Демонстрация 2

1 голос
/ 18 марта 2020

Вы можете использовать функцию analytical здесь следующим образом:

Select * from
(Select t.*, 
       Sum(case when inrunningdelay_1 = leadval then 1 end)
           over (partition by writer order by wrriten_1) as sm
 from
(Select t.*,
        lead(inrunningdelay_1) over (partition by writer order by wrriten_1) as leadval
from your_table t) t)
Where sm = 1;

Cheers !!

...