Как я могу удалить все столбцы, которые дублируются и не имеют самой большой «суммы». У меня есть следующая таблица:

ID           TIME            AMMOUNT

1              x                5
2              y                1
2              y                3
3              z                1
3              z                2
3              z                3

Но я хочу, чтобы это было так, чтобы «выживал» только столбец с наибольшим числом:

ID           TIME            AMMOUNT

1              x                5
2              y                3
3              z                3

Как я могу это сделать?

-1
Petra Enis 13 Янв 2022 в 00:33
Что, если две строки имеют одинаковый идентификатор и сумму?
 – 
ysth
13 Янв 2022 в 00:39
Как я могу удалить все столбцы предположительно вы имеете в виду строки?
 – 
Stu
13 Янв 2022 в 00:45

4 ответа

Вы можете получить максимальную сумму за идентификатор и время, а затем получить соответствие строк:

select t.Id, t.Time, t.ammount
from myTable t 
inner join 
(select Id, time, max(ammount) as amt
from myTable
group by Id, Time) tmp on t.id = tmp.id and 
               t.time = tmp.time and
               t.ammount = tmp.amt

DbFiddle demo

РЕДАКТИРОВАТЬ: вы можете добавить DISTINCT в зависимости от ваших потребностей.

3
Cetin Basoz 13 Янв 2022 в 00:44
WITH cte AS (
  SELECT ID, ROW_NUMBER() OVER (PARTITION BY TIME ORDER BY AMMOUNT DESC) AS ROWNUM
  FROM MyTable
)
DELETE MyTable FROM MyTable JOIN cte USING (ID)
WHERE ROWNUM > 1;

Для С синтаксисом требуется MySQL 8.0.

2
Bill Karwin 13 Янв 2022 в 00:46

Еще один подход с использованием CTE

with del as (
  select *, 
    First_Value(amount) over(partition by id order by amount desc) maxamount
  from t
)
delete from t
using t join del on t.id = del.id and t.amount < maxamount;
1
Stu 13 Янв 2022 в 01:08

Я думаю, что некоторые из ответов здесь слишком сложны.

delete t from yourtable t join yourtable t2 on t.id=t2.id and t.time=t2.time and t2.ammount > t.ammount
0
ysth 13 Янв 2022 в 04:08