Я полагаю, что может подойти следующее: -
-- Select SQL
SELECT rowid, first, street, state, age, weight
FROM mytable AS mt1
WHERE (age * 1000 + weight) = (
SELECT min(age * 1000 + weight)
FROM mytable
WHERE first = mt1.first AND last = mt1.last AND street = mt1.street AND state = mt1.state
ORDER BY (age,weight) ASC
LIMIT 1
)
- Это сочетает в себе возраст и вес (но сохраняя индивидуальность каждого компонента для сравнения, следовательно, умножая возраст на 1000 (предполагает наивысший вес)будет меньше 1000, в противном случае потребуется большее число))
- Предложение were сравнивает это значение с минимальным таким значением для того же первого, последнего, улицы и штата (нет необходимости в GROUP BY как выбранномвсе строки в соответствии с группой).
Тогда легко использовать это для удаления строк, не входящих в SELECT, используя (оберните запрос в предложении WITH как Общая таблицаВыражение (CTE) и затем использовать CTE (cte1) для запуска УДАЛЕНИЯ, чтобы удалить строки, чей rowid отсутствует в извлеченном списке rowid 's: -
-- Delete SQL
WITH cte1 AS
(
SELECT rowid, first, street, state, age, weight
FROM mytable AS mt1
WHERE (age * 1000 + weight) = (
SELECT min(age * 1000 + weight)
FROM mytable
WHERE first = mt1.first AND last = mt1.last AND street = mt1.street AND state = mt1.state
ORDER BY (age,weight)
LIMIT 1
)
)
DELETE FROM mytable WHERE rowid NOT IN (SELECT cte1.rowid FROM cte1)
;
- Примечание предполагает, что таблица не является таблицей БЕЗ ROWID.
Тестирование
Выше было проверено с использованием следующего: -
-- Load testing data
DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (first, last, street, state, age, weight);
INSERT INTO mytable VALUES
('John', 'Doe', '1 Elm', 'NY', 50, 120),
('John', 'Doe', '1 Elm', 'NY', 35, 140),
('John', 'Doe', '1 Elm', 'NY', 35, 139),
('Mark', 'Knopfler', '6 Strait', 'CT', 67, 130),
('Mary', 'West', '32 E St', 'NJ', 90, 88),
('Mary', 'West', '32 E St', 'NJ', 55, 120), -- <<<<<<<<<< duplicated below
('Mary', 'West', '32 E St', 'NJ', 55, 125),
('Mary', 'West', '32 E St', 'NJ', 55, 124),
('Mary', 'West', '32 E St', 'NJ', 55, 120), -- <<<<<<<<<< duplicate
('Mary', 'West', '32 E St', 'NJ', 55, 121)
;
- Обратите внимание, из вопроса неясно, должно ли быть какое-либо конкретное действиедля дублированных строк с наименьшим возрастом и весом (см. выделенные вставки выше)
- В таком виде такие дубликаты останутся (не может существовать, если для объединенных столбцов было создано составное УНИКАЛЬНОЕ ограничение)
.
-- Show table before deletion
SELECT * FROM mytable;
-- Select SQL (not needed as embedded in delete below)
SELECT rowid, first, street, state, age, weight
FROM mytable AS mt1
WHERE (age * 1000 + weight) = (
SELECT min(age * 1000 + weight)
FROM mytable
WHERE first = mt1.first AND last = mt1.last AND street = mt1.street AND state = mt1.state
ORDER BY (age,weight)
LIMIT 1
)
;
-- Delete SQL
WITH cte1 AS
(
SELECT rowid, first, street, state, age, weight
FROM mytable AS mt1
WHERE (age * 1000 + weight) = (
SELECT min(age * 1000 + weight)
FROM mytable
WHERE first = mt1.first AND last = mt1.last AND street = mt1.street AND state = mt1.state
ORDER BY (age,weight)
LIMIT 1
)
)
DELETE FROM mytable WHERE rowid NOT IN (SELECT cte1.rowid FROM cte1)
;
-- Result after deletion
SELECT * FROM mytable;
Результаты
Результаты выше:
Загруженные данные

Запрос на выборку

- Примечание: выделенные строки повторяют строки, соответствующие минимумам
Данные после удаления
