SQL: SELECT 全部并根据多列的值删除重复的行

SQL: SELECT all and Remove duplicated rows based on values from multiple columns

我有以下 SQL table 姓名 'orders':

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

而且我正在尝试 Select 仅 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',但我需要 select 结果中的所有列。

这是预期的结果:

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

希望清楚,谢谢。

您可以使用 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

根据您的样本数据,很难准确地看出您要查找的 partitionorder by 子句,因此您可能需要根据您的具体用例调整它们。

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;

简单:

SELECT DISTINCT * FROM orders 

你可以试试这个。

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

现场db<>fiddle演示。