В 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;
ОБНОВЛЕНИЕ
Публикация всего сценария тестирования, включая приведенный выше оператор 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
person
Andriy M
schedule
25.07.2011
item=7
, гдеprice1,price2
=30,100
,100,30
и40,40
, какие из них следует удалить? - person ypercubeᵀᴹ   schedule 25.07.2011