SQL:全选并根据来自多列的值删除重复的行

问题描述 投票:0回答:4

我具有以下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不相同的行(仅当BOTH具有相同的值时才删除重复的行,我尝试如下使用“ 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 |
+--------------+------------+-------------------+------------+

我希望清楚,谢谢。

sql sql-server tsql duplicates greatest-n-per-group
4个回答
1
投票

您可以使用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子句,因此您可能需要根据实际用例进行调整。


1
投票

简单地:

SELECT DISTINCT * FROM orders 

0
投票

[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;

0
投票

您可以尝试这个。

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演示。

© www.soinside.com 2019 - 2024. All rights reserved.