Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Sql запрос на удаление одинаковых звонков


Автор: addtanya 9.8.2008, 15:40
Привет! Помогите пжл. доработать запрос!
Сначала объясню суть проблемы: есть таблица звонков calls в ней поля id, duration_sec(продолжительность звонка), call_num (исх. звонок), call_num_in (вход. звонок), datetime. В этой таблице есть повторяющиеся звонки, т.е. все вышеперечисленные поля одинаковы.. 
Вот запрос:
SELECT *
FROM calls c1
WHERE phone_id = '00240' and datetime_call between '20080701' and '20080731' and ( SELECT COUNT(*) 
               FROM calls c2 
               WHERE c1.datetime_call = c2.datetime_call and c1.duration_sec = c2.duration_sec and c1.call_num = c2.call_num and c1.call_num_in = c2.call_num_in) > 1

Этот запрос выбирает все дублирующиеся звонки
Пример: 
id   phone_id   datetime_call      duration_sec    call_num    call_num_in 
1    00240        2008.07.10          50                     4545         9999
2    00240        2008.07.10           50                    4545         9999
......
Необходимо оставить один из них (любой), а второй удалить!

Автор: Данкинг 9.8.2008, 16:49
Т.е. звёздочку заменить на "distinct", что ли?

Автор: addtanya 9.8.2008, 17:16
так не работает, я не знаю какой критерий ему задать, чтобы в результате запроса оставались только одинарные звонки, те которые повторяются вообще надо удалить... smile

Автор: Данкинг 9.8.2008, 18:01
Код

select distinct id,   phone_id,   datetime_call,      duration_sec,    call_num,    call_num_in from calls 

Автор: Magnifico 10.8.2008, 13:11
distinct удаляет дублирующие строки ( в результате запроса  нет дублирующих строк , тк id разное)
надо взять агрегат от поля id , остальные поля сгруппировать.

Код

select max(id),    все остальные поля
from
(
SELECT *
FROM calls c1
WHERE phone_id = '00240' and datetime_call between '20080701' and '20080731' and ( SELECT COUNT(*) 
               FROM calls c2 
               WHERE c1.datetime_call = c2.datetime_call and c1.duration_sec = c2.duration_sec and c1.call_num = c2.call_num and c1.call_num_in = c2.call_num_in) > 1
)
group by    все остальные поля

Автор: addtanya 11.8.2008, 09:15
Спасибо за помощь, запрос работает! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)