SQL: ВЫБРАТЬ все и удалить дублирующиеся строки на основе значений из нескольких столбцов - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующее SQL имя таблицы 'orders':

+--------------+------------+-------------------+------------+
| order_id     | item_id    |   amount          | commission |
+--------------+------------+-------------------+------------+
|          111 | 1234       | 23                |          1 |
|          222 | 1234       | 34                |          2 |
|          111 | 2345       | 45                |          3 |
|          111 | 1234       | 23                |          1 |
+--------------+------------+-------------------+------------+

И я пытаюсь выбрать только те строки, в которых order_id и item_id НЕ совпадают (удаляйте дубликаты, только если ОБА имеет то же значение), я попытался использовать «Group_By» следующим образом:

SELECT * FROM orders GROUP BY order_id,item_id

, но при этом удаляются все дубликаты order_id и все дубликаты item_id, вот результат:

+--------------+------------+-------------------+------------+
| order_id     | item_id    |   amount          | commission |
+--------------+------------+-------------------+------------+
|          111 | 1234       | 23                |          1 |
|          222 | 1234       | 34                |          2 |
+--------------+------------+-------------------+------------+

Я тоже пытался использовать DISTINCT, но мне нужно выбрать все столбцы в результате.

вот ожидаемый результат:

+--------------+------------+-------------------+------------+
| order_id     | item_id    |   amount          | commission |
+--------------+------------+-------------------+------------+
|          111 | 1234       | 23                |          1 |
|          222 | 1234       | 34                |          2 |
|          111 | 2345       | 45                |          3 |
+--------------+------------+-------------------+------------+

Надеюсь, его очистить Спасибо.

Ответы [ 4 ]

2 голосов
/ 17 апреля 2020

Просто:

SELECT DISTINCT * FROM orders 
2 голосов
/ 17 апреля 2020

Вы можете использовать row_number():

select order_id, item_id, amount, commission
from (
    select t.*, row_number() over(partition by order_id, item_id order by commission) rn
    from mytable t
) t
where rn = 1

С вашими примерами данных непросто увидеть, какие именно предложения partition и order by вы ищете, поэтому вам может понадобиться отрегулируйте их в соответствии с вашими потребностями.

0 голосов
/ 17 апреля 2020

Вы можете попробовать это.

create table MyTable
(order_id int
, item_id int
, amount int
, commission int)

insert into MyTable values
(111, 1234, 23, 1),
(222, 1234, 34, 2),
(111, 2345, 45, 3),
(111, 1234, 23, 1)

select distinct * from MyTable

Live db <> fiddle demo.

0 голосов
/ 17 апреля 2020

SELECT DISTINCT должен делать то, что вы хотите

SELECT DISTINCT order_id, item_id, amount, commission
FROM orders;

Если у вас есть больше столбцов, но вам нужно только дублировать их, вы можете использовать ROW_NUMBER():

SELECT o.*
FROM (SELECT o.*,
             ROW_NUMBER() OVER (PARTITION BY order_id, item_id, amount, commission ORDER BY (SELECT NULL)) as seqnum
      FROM orders o
     ) o
WHERE seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...