Oracle Update Первые 20 записей на основе заказа по - PullRequest
0 голосов
/ 12 июня 2018

У меня есть таблица, в которой я пытаюсь обновить столбец.Дело в том, что есть 40 записей, в которых я заказываю по удару.Затем я хочу взять топ-10 из них (в зависимости от их влияния) и обновить их

UPDATE mytable
SET status = 'red'
WHERE status IN
(

    SELECT status
      FROM (
        SELECT *
        FROM mytable
        WHERE status = 'green'
        ORDER BY impact DESC
        )
)
AND ROWNUM <= 10

Я попытался поместить ROWNUM в оператор WHERE IN, но он просто проигнорирует его и обновит все 40 записей.Когда я делаю это так, как у меня выше, он выбирает 10, но он не выбирает 10 лучших, он просто выбирает их случайным образом.Я предполагаю, что он игнорирует влияние ORDER BY.

Я пытался найти похожую проблему, но ничего не могу найти.Любая помощь высоко ценится!

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

если бы это был я, я использовал бы diff_rank, у вас мог бы быть крайний случай, когда влияние для более чем одной строки одинаково, поэтому вы можете получить более 40 строк

, не уверенный, что статус является фактическим столбцомвы хотите, как и другой ответ, вы могли бы, чтобы ПК запускал обновление

UPDATE mytable
SET status = 'red'
WHERE status IN
(

    SELECT status
      FROM (
        SELECT status, dense_rank() over (order by impact desc) color_rank
        FROM mytable
        WHERE status = 'green'
        )
      where color_rank <= 40
)
0 голосов
/ 12 июня 2018

Это может сработать:

UPDATE mytable
SET status = 'red'
WHERE status IN
(

    SELECT level_0_impact
      FROM (
        SELECT impact level_0_impact
        FROM mytable
        WHERE status = 'green'
        ORDER BY impact DESC
        )
    where rownum <=10
);

Я только что протестировал с hr.employees, и это работает:

update hr.employees
set salary=99999
where salary in 
(select level0
   from (
          select salary level0
          from hr.employees
          order by salary desc)
   where rownum < 4 
);
0 голосов
/ 12 июня 2018

Обновляет любую запись с теми статусами, где вы хотите конкретные записи.В предложении where попробуйте использовать столбец id вместо status, поэтому

WHERE id in (select id from mytable where status='green' and rownum<=10 order by impact desc )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...