Как удалить записи поменьше для каждой группы? - PullRequest
0 голосов
/ 25 июля 2011

Моя таблица цена имеет текущую схему:

item date         shift     price1  price2
1    20110723     day       40      50
1    20110723     night     42      52
1    20110723     weekend   42      52
2    20110723     Night     40      50
...

И я хочу сохранить записи с самой высокой ценой1 или ценой2 для каждого элемента в таблице, то есть удалить из таблицы записи с меньшей ценой1 или ценой2. Как написать sql?

Я использую Sybase ASE 12.5

Ответы [ 2 ]

1 голос
/ 25 июля 2011

В 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
0 голосов
/ 25 июля 2011

вы можете написать следующий запрос, если вы работаете в oracle -

delete from item_table where rowid not in
(
     select rowid from item_table 
     where (item,price1) in (select item,max(price1) from item_table group by item)
        or (item,price2) in (select item,max(price2) from item_table group by item)
)

Я слышал, что rowid не существует в SQL Server или MySQL ... расскажите нам, пожалуйста, какое имя вашей базы данных вы используете.

Вы также можете написать как следует ..

delete from item_table where (item,date,shift,price1,price2 ) not in
    (
        select item,date,shift,price1,price2  from item_table 
        where (item,price1) in (select item,max(price1) from item_table group by item)
           or (item,price2) in (select item,max(price2) from item_table group by item)
    )
...