2013-04-02 2 views
4

У меня есть таблица со следующей структуройSQL удалить дубликаты из GROUP BY результатов

sys_id(identity) | id | group_id | fld_id | val 
----------------------------------------------- 

У меня есть запрос

SELECT id,group_id,fld_id,val,COUNT(*) 
FROM [DB_ALERT].[dbo].[DATATABLE] 
GROUP BY id,group_id,fld_id,val 
HAVING COUNT(*)>1 

Набор Ресула подобен этому

ID | group_id | fld_id | val| count(*) 
__________________________________________ 
1000001| 1  | 1  | 23 | 2 
1000003| 1  | 1  | 24 | 5 
1000008| 1  | 1  | 14 | 4 

сейчас в результирующем наборе я хочу взять только 1 верхнюю часть sys_id для каждой записи и удалить остальные с одинаковыми ID, Group, Fld и val (удалить его дубликат licates). Я знаю, как это сделать с помощью курсоров, но есть ли способ сделать такую ​​операцию в одном запросе?

+0

Какая база данных? – TechDo

+0

@techdo SQL Server 2008 r2 – Alex

+0

без курсора вы можете использовать временную таблицу и достичь этого. – Sachin

ответ

4

Пожалуйста, попробуйте:

;with c as 
(
    select *, row_number() over(partition by ID, Group, Fld, val order by ID, Group, Fld, val) as n 
    from YouTable 
) 
delete from c 
where n > 1 
+0

спасибо, ваш запрос работает. Я сомневаюсь, можно ли сделать такой запрос с помощью стандартного SQL? – Alex