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
根据您的样本数据,很难准确地看出您要查找的 partition
和 order 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演示。
我有以下 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
根据您的样本数据,很难准确地看出您要查找的 partition
和 order 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演示。