sql - удалить строки, которые меньше значения, используя rank и groupby - PullRequest
0 голосов
/ 20 мая 2019

В таблице у меня есть потоки и работает

для каждого потока я должен сохранить строку с максимальным количеством прогонов, удалить оставшиеся все. Это должно быть сделано для всех потоков.

Использование одного оператора.

Я пытался использовать cte, rank, но получил ошибку.

Я попытался сгруппировать по потокам, а затем применить ранг для группы, а затем удалить строки, которые> 1.


WITH cte AS 

( SELECT flow, RANK() OVER 

       (PARTITION BY flow ORDER BY runs) 

AS rank FROM TEST_RESULTS_TABLE GROUP BY flow )

DELETE FROM cte WHERE rank >1 ;


this is giving :

ORA-00928: missing SELECT keyword
00928. 00000 -  "missing SELECT keyword"
*Cause:    
*Action:
Error at Line: 25 Column: 153

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Oracle не поддерживает обновляемые CTE.Вместо этого вы можете сделать:

delete from test_results_table trt
    where runs > (select min(trt2.runs)
                  from test_results_table trt2
                  where trt2.flow = trt.flow
                 )
1 голос
/ 20 мая 2019

Вы можете использовать свой запрос RANK() (без GROUP BY) и сопоставить его с оператором DELETE, используя псевдостолбец ROWID:

DELETE FROM test_results_table
WHERE ROWID IN (
  SELECT ROWID
  FROM   (
    SELECT RANK() OVER ( PARTITION BY flow ORDER BY runs ASC ) AS rnk
    FROM   test_results_table
  )
  WHERE rnk > 1
)

дБ <> скрипка здесь

...