2013-10-10 2 views
0

Привет У меня есть следующая таблица сказать ценаSQL отображение строк с повторяющимися значениями в 3 Ряды

CostID ItemID Level EffectiveFrom EffectiveTo    
6274751 12345 1  12/02/2013 NULL 
6274751 12345 1  13/02/2013 NULL 
6274751 12345 2  12/02/2013 NULL 
6254784 12345 1  12/02/2013 NULL 
6254784 12345 1  13/02/2013 NULL 
6244784 12345 9  12/02/2013 NULL 

Я хотел бы, чтобы иметь возможность написать запрос, чтобы найти повторяющиеся строки путем сравнения 3 столбцов «CostID» ' ItemID»и„Level“и отобразить те, которые являются дубликатами только

Ожидаемые результаты Часть 1

CostID ItemID Level EffectiveFrom EffectiveTo    
6274751 12345 1  12/02/2013 NULL 
6274751 12345 1  13/02/2013 NULL 
6254784 12345 1  12/02/2013 NULL 
6254784 12345 1  13/02/2013 NULL 

После того, как я получаю результат выше, и я хотел бы обновить таблицу EffectiveTo от последнего повторяющиеся строки

Ожидаемые результаты по части 2

CostID ItemID Level EffectiveFrom EffectiveTo    
6274751 12345 1  12/02/2013 13/02/2013 
6274751 12345 1  13/02/2013 NULL 
6254784 12345 1  12/02/2013 13/02/2013 
6254784 12345 1  13/02/2013 NULL 

Я попытался это:

{ 
SELECT * 
FROM price 
WHERE ItemID IN 
    ( SELECT ItemID 
      FROM price 
      GROUP BY ItemId   HAVING COUNT(distinct level) > 1 
    ) 
ORDER BY CostID } 

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

Благодаря

+0

Какой sql вы используете? –

+0

SQL Server 2005, Спасибо, что отформатировал его для меня – user2865216

+0

Существует так много, что вы хотели определить. Пожалуйста, будьте конкретны. Укажите ожидаемый результат. –

ответ

1

Это даст вам повторяющиеся строки:

select distinct p.* 
from price p 
join price q 
    on p.CostID = q.CostID 
    and p.ItemID = q.ItemID 
    and p.Level = q.Level 
    and p.EffectiveFrom != q.EffectiveFrom 

Условия p.EffectiveFrom != q.EffectiveFrom важно, поскольку она останавливает все строки присоединения к себе. Обычно вы просто сравниваете столбец id для неравенства, но ваша таблица, похоже, не имеет такого.


Чтобы обновить старую строку с подходящей датой окончания:

update p set 
p.EffectiveTo = dateadd(day, -1, q.EffectiveFrom) 
from price p 
join price q 
    on p.CostID = q.CostID 
    and p.ItemID = q.ItemID 
    and p.Level = q.Level 
    and p.EffectiveFrom < q.EffectiveFrom 

Единственное отличие с этим запросом изменяется неравенство к менее чем, таким образом, выбирая для обновления только те строки, которые являются более ранними.

Обратите внимание, что я вычитал 1 день с более поздней даты, поэтому нет перекрытия.

+0

Используя этот запрос, я получаю слишком много результатов, хотя, если у меня есть 41 000 записей в моей таблице, после запуска запроса я получаю 100 000 записей. Все, что я хотел увидеть, было около 1000 дубликатов записей, поэтому я мог вручную выполнить Часть 2. Как и в моем примере, у меня было 6 записей, и после запуска запроса я хотел бы увидеть 4 дубликата. Спасибо – user2865216

+0

У вас есть несколько (более 2) строк с одинаковыми ключевыми данными? – Bohemian

+0

Когда я запустил второй запрос, он говорит, что таблица «цена» неоднозначна. – user2865216

0

Это немного длинный ... но вы можете внести некоторые улучшения.

;WITH cte AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY CostID, ItemID, Level ORDER BY CostID, EffectiveFrom) AS RNUM, 
     CostID, 
     ItemID, 
     Level, 
     EffectiveFrom, 
     EffectiveTo 
    FROM @Price 
), 
cteDup AS 
(
    SELECT DISTINCT CostID, ItemID, Level FROM cte WHERE RNUM > 1 
) 
SELECT tt.* FROM @Price tt 
INNER JOIN cteDup cc ON tt.CostID = cc.CostID AND tt.ItemID = cc.ItemID AND tt.Level = cc.Level 

UPDATE: Это позволит сделать прямое обновление, не уверен, если это то, что вы хотите Тхо.

;WITH cte AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY CostID, ItemID, Level ORDER BY CostID, EffectiveFrom) AS RNUM, 
     CostID, 
     ItemID, 
     Level, 
     EffectiveFrom, 
     EffectiveTo 
    FROM @Price 
) 
UPDATE c1 SET 
    EffectiveTo = c2.EffectiveFrom 
FROM cte c1 
INNER JOIN cte c2 ON c1.CostID = c2.CostID AND c1.ItemID = c2.ItemID AND c1.Level = c2.Level AND c1.RNUM + 1 = c2.RNUM 
+0

Это дает мне результат отлично, но не может обновляться, как только результат отображается. Есть ли запрос обновления для достижения Части 2 без необходимости выполнять Часть 1? – user2865216

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