Как выбрать только 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) - нет. Смотрите этот ответ: