В SQL Server (и, возможно, некоторых других РСУБД) вы можете использовать CTE и рейтинг , например:
WITH ranked AS (
SELECT
*,
price1rank = RANK() OVER (PARTITION BY item ORDER BY price1 DESC),
price2rank = RANK() OVER (PARTITION BY item ORDER BY price2 DESC)
FROM Test1
)
DELETE FROM ranked
WHERE price1rank <> 1
AND price2rank <> 1;
UPDATE
Публикация всего скрипта тестирования, включая приведенный выше оператор DELETE, так что любой желающий может поиграть с ним или просто проверить, работает ли он:
CREATE TABLE Test1 (
item int,
date date,
shift varchar(30),
price1 money,
price2 money
);
GO
INSERT INTO Test1 (item, date, shift, price1, price2)
SELECT 1, '20110723', 'day ', 40, 50 UNION ALL
SELECT 1, '20110723', 'night ', 42, 52 UNION ALL
SELECT 1, '20110723', 'weekend', 42, 52 UNION ALL
SELECT 2, '20110723', 'Night ', 40, 50;
GO
SELECT * FROM Test1
GO
WITH Test1Ranked AS (
SELECT
*,
price1rank = RANK() OVER (PARTITION BY item ORDER BY price1 DESC),
price2rank = RANK() OVER (PARTITION BY item ORDER BY price2 DESC)
FROM Test1
)
DELETE FROM Test1Ranked
WHERE price1rank <> 1
AND price2rank <> 1;
GO
SELECT * FROM Test1
GO
DROP TABLE Test1
GO