Это больше похоже на работу для NOT EXISTS
.
Для тех, кто имеет NULL serial_number, вы хотите сохранить только те, которые имеют наименьший идентификатор для номера_части.
Так что вам просто нужночтобы отфильтровать те, которые вам не нужны.
SELECT *
FROM YourTable t
WHERE NOT EXISTS
(
SELECT 1
FROM YourTable d
WHERE d.`part number` = t.`part number`
AND d.serial_number IS NULL
AND t.serial_number IS NULL
AND d.id < t.id
)
ORDER BY id;
Результат:
id | part number | serial_number | qty
-- | ----------- | ------------- | ---
1 | A | 12345 | 1
2 | A | 54321 | 1
3 | A | 67890 | 1
4 | B | null | 10
6 | C | null | 6
Тест по db <> fiddle здесь
Кстати, в MySql 5.x, когда настройка ONLY_FULL_GROUP_BY не активна.
Тогда это даст тот же результат.
Но тогда это будет не только для тех, у кого NULL serial_number.
SELECT *
FROM YourTable
GROUP BY `part number`, serial_number
ORDER BY id
Тест здесь