Удаление верхних 5% и нижних 5% всех записей - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть таблица, которая выглядит так:

Customer ID, MDN, Plan, StartDate, EndDate, Term, SMS Usage, Voice Usage

Заказ по СМС Использование в порядке возрастания или убывания

Я хочу удалить верхние 5% всех записей, а нижние 50%, оставив позади оставшиеся 90% клиентов

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012
SELECT TOP 5 PERCENT CustomerID
INTO #TopPct
FROM YourTable
ORDER BY SMSUsage;

SELECT TOP 5 PERCENT CustomerID
INTO #BottomPct
FROM YourTable
ORDER BY SMSUsage DESC;

DELETE FROM YourTable
WHERE CustomerID IN (
  SELECT CustomerID FROM #TopPct
  UNION
  SELECT CustomerID FROM #BottomPct
);

Первые два запроса собирают верхний и нижний процент записей. Последний запрос использует найденные записи в обоих (#TopPct и #BottomPct) для выбора записей для удаления.

2 голосов
/ 28 февраля 2012
;WITH x AS
(
    SELECT CustomerID FROM 
    (
      SELECT TOP 5 PERCENT CustomerID FROM dbo.table 
      ORDER BY [SMS Usage]
    ) AS lowest
    UNION ALL
    SELECT CustomerID FROM
    (
      SELECT TOP 5 PERCENT CustomerID FROM dbo.table
      ORDER BY [SMS Usage] DESC
    ) AS highest
)
-- DELETE t FROM dbo.table AS t INNER JOIN x ON t.CustomerID = x.CustomerID;
SELECT CustomerID FROM t;

Если вы удовлетворены тем, что запрос возвращает правильные строки, вы можете раскомментировать DELETE и прокомментировать или удалить последнюю строку.

0 голосов
/ 28 февраля 2012

Вы можете использовать ntile .

;with C as
(
  select ntile(20) over(order by SMSUsage) as nt
  from YourTable       
)      
delete from C
where nt in (1,20)

Примерь SE-данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...