2013-02-20 5 views
3

TSQL 2008 R2Выбрать верхние N строк из таблицы колонки, содержащей N

У меня есть элементы повторяющиеся строки каждый со своим уникальным ID для данного PO #. Мне нужно УДАЛИТЬ дубликаты. Я не знаю, сколько дубликатов у меня есть для каждого PO #. Потому что есть #LineItems, которые я знаю, мне нужны только первые (верхние) позиции x (#lineIems).

У меня есть таблица, например, так:

LineitemID PO#  #LineItems 
---------- ------- ---------- 
11111111 12345 3 
22222222 12345 3 
33333333 12345 3 
44444444 12345 3 
55555555 12345 3 
66666666 12345 3 
77777777 54321 2 
88888888 54321 2 
99999999 54321 2 
10101010 54321 2 
... 

мне нужен стол, как это:

LineitemID PO#  #LineItems 
---------- ------- ---------- 
11111111 12345 3 
22222222 12345 3 
33333333 12345 3 
77777777 54321 2 
88888888 54321 2 
... 

Так в основном есть способ сделать что-то вроде этого:

DECLARE @top int = (SELECT TOP 1 FROM tblLineItems t WHERE t.PO# = @PO) 

SELECT TOP (@top) 
FROM tblLineItems 

И сделайте это за каждый PO #

+0

Благодаря @LittleBobbyTables. Ты просто написал то, что думал! EDIT: комментарий Previoius удален - так coudl вы объясните, пожалуйста, ваш желаемый результат? Почему линии 4444444, 5555555, 666666 ушли? Какое ваше заслуженное правило для устранения линий? Где po # 43125 на линии 888888? – Nico

+0

О, я вижу, что вы пытаетесь сделать сейчас. @Nico - столбец LineItems определяет, сколько строк возвращается на PO #. Archangel33, Когда вы говорите «исключить», вы имеете в виду «Исключить из запроса» или «удалить из таблицы»? – LittleBobbyTables

+0

@LittleBobbyTables Если LineItems описывает, сколько строк возвращается на PO # - где находятся 2 строки с LineitemID 7777777 и 888888 в необходимой таблице OP? – Nico

ответ

2

Удаленный первый ответ после facepalm.

Единственная проблема с вашим примером заключается в том, что вы не запросили ORDER BY в запросе TOP, который мог вывести результаты в любом порядке. Этот запрос предполагает, что вы заказываете с помощью LineItemID (целочисленного типа) ASC.

DECLARE @LineItems TABLE 
(
    LineItemID INT 
    , PO INT 
    , NumLineItems INT 
) 

INSERT INTO @LineItems (LineItemID, PO, NumLineItems) 
SELECT 11111111, 12345, 3 
UNION ALL SELECT 22222222, 12345, 3 
UNION ALL SELECT 33333333, 12345, 3 
UNION ALL SELECT 44444444, 12345, 3 
UNION ALL SELECT 55555555, 12345, 3 
UNION ALL SELECT 66666666, 12345, 3 
UNION ALL SELECT 77777777, 54321, 2 
UNION ALL SELECT 88888888, 54321, 2 
UNION ALL SELECT 99999999, 54321, 2 
UNION ALL SELECT 10101010, 54321, 2 

DELETE b 
FROM 
(
    SELECT * 
     , RANK() OVER (PARTITION BY PO, NumLineItems ORDER BY LineItemID ASC) AS r 
    FROM @LineItems 
) a 
JOIN @LineItems b 
    ON a.LineItemID = b.LineItemID 
WHERE r > a.NumLineItems 

SELECT * 
FROM @LineItems 
ORDER BY PO, LineItemID 
2
delete t from (select *, rank = row_number() over (partition by PO# order by lineitemid) 
       from table) t 
where rank > #lineitems 
+0

Вы должны также предоставить запрос SELECT в случае, если OP хочет получить данные. –

Смежные вопросы