Как выбрать только 1 строку при дублировании строк (Oracle)

У меня есть таблица с информацией о заказе, как показано ниже:

Как видно из этой таблицы, у каждого order_no есть несколько дубликатов. Так что я хочу, чтобы сохранить только одну строку для каждого order_no (независимо от того, какой)

Кто-нибудь знает, как это сделать?(И я пробовал "отличные", но некоторые столбцы этих повторяющихся строк разные, поэтому "отличные" здесь не могут работать)

3 ответа

Может быть, как-то так? Вы можете использовать PARTITION BY а также ORDER BY пункты, чтобы определить, какая строка возвращается. Воздушный код:

SELECT t.*
FROM (
     SELECT o.*
          , ROW_NUMBER() OVER (PARTITION BY o.order_no ORDER BY o.sequence_no) rn
     FROM ordertable o
     ) t
WHERE rn = 1
;

У меня была та же проблема, и этот запрос работал для меня.

WITH summary
       AS (SELECT   g.*,
                    ROW_NUMBER ()
                       OVER (PARTITION BY g.param_text
                             ORDER BY g.gnl_param_id DESC)
                       AS rk
             FROM  gnl_param g)
SELECT   s.gnl_param_id, s.param_text
  FROM   summary s
 WHERE   s.rk = 1

Здесь столбец param_text должен быть уникальным, но каким-то образом возникли повторяющиеся строки. Вот почему я использовал раздел по ключевым словам в этом столбце.

SELECT *
FROM
    (
       SELECT *
          ,ROW_NUMBER() OVER (PARTITION BY ORDER_NO ORDER BY ????) as RowNumber
       FROM
          Orders
    ) o
WHERE
    o.RowNumber = 1

Просто заполните заказ по предложению, чтобы выбрать, какой записи вы хотите быть первой строкой. Если вам не важен порядок записи, измените строку на

,ROW_NUMBER() OVER (PARTITION BY ORDER_NO ORDER BY Null) as RowNumber

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htm

Я предполагаю, что голосование "за" из-за ORDER BY NULL? Но Oracle принимает это, а tsql (sql-server) - нет. Смотрите этот ответ:

что это значит "заказ по NULL"

Другие вопросы по тегам