Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбрать необходимые записи  [new]
Forx
Member

Откуда:
Сообщений: 52
В БД ведется лог вызовов. Каждый зарегистрированный софтфон пишет о каждом входящем (принят, пропущен) или исходящем вызове.
Нужен запрос, который обьединит все записи, но исключит не нужные.
Например: было 3 входящих, 1 принял вызов, для остальных двух вызов записался как пропущенный.
Соответственно в запросе нужно исключить те у которых вызов пропущенный, и показать только 1 принятый. Если вызов для всех пропущенный - то в запросе только 1 запись по этому вызову.
+

declare  @SIPLog TABLE(
	[CallID] [varchar](100) NULL,
	[Phone] [varchar](20) NULL,
	[CallTime] [datetime] NULL,
	[IDUser] [int] NULL,
	[CallType] [int] NULL); -- 1-пропущенный, 2-принятый
	
insert into @siplog values	
('597D7DEC86D544F080F621919D48DDD9','84950000000','2013-04-30 15:11:48.363',51,1);
insert into @siplog values
('597D7DEC86D544F080F621919D48DDD9','84950000000','2013-04-30 15:11:48.363',52,1);
insert into @siplog values
('597D7DEC86D544F080F621919D48DDD9','84950000000','2013-04-30 15:11:48.363',53,1);

insert into @siplog values
('11a448f66af265eb3a58d88e62c1c597','84950000001','2013-04-30 16:22:14.234',51,1);
insert into @siplog values
('11a448f66af265eb3a58d88e62c1c597','84950000001','2013-04-30 16:22:14.234',52,1);
insert into @siplog values
('11a448f66af265eb3a58d88e62c1c597','84950000001','2013-04-30 16:22:14.234',53,2);


-- пока получилось только так, но в итоговом запросе должны быть все поля исходной таблицы

select callid, phone, calltype 
from @siplog where calltype = 2
group by callid, phone, calltype
union all
select callid, phone, calltype 
from @siplog where calltype = 1		
				and not callid in (select callid from @siplog where calltype = 2)
group by callid, phone, calltype
union all
select callid, phone, calltype 
from @siplog where calltype = 0 --исходящие вызовы

7 май 13, 18:36    [14269804]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать необходимые записи  [new]
aleks2
Guest
declare  @SIPLog TABLE(
	[CallID] [varchar](100) NULL,
	[Phone] [varchar](20) NULL,
	[CallTime] [datetime] NULL,
	[IDUser] [int] NULL,
	[CallType] [int] NULL); -- 1-пропущенный, 2-принятый
set dateformat ymd

insert into @siplog values	
('597D7DEC86D544F080F621919D48DDD9','84950000000','2013-04-30 15:11:48.363',51,1);
insert into @siplog values
('597D7DEC86D544F080F621919D48DDD9','84950000000','2013-04-30 15:11:48.366',52,1);
insert into @siplog values
('597D7DEC86D544F080F621919D48DDD9','84950000000','2013-04-30 15:11:48.369',53,1);

insert into @siplog values
('11a448f66af265eb3a58d88e62c1c597','84950000001','2013-04-30 16:22:14.234',51,1);
insert into @siplog values
('11a448f66af265eb3a58d88e62c1c597','84950000001','2013-04-30 16:22:14.234',52,1);
insert into @siplog values
('11a448f66af265eb3a58d88e62c1c597','84950000001','2013-04-30 16:22:14.234',53,2);

select *
from @siplog where calltype = 2
union all
select *
from @siplog s 
where calltype = 1 
and not exists(select * from @siplog x where x.CallType = 2 and x.CallID = s.CallID and x.Phone = s.Phone )
and not exists(select * from @siplog x where x.CallType = 1 and x.CallID = s.CallID and x.Phone = s.Phone and x.CallTime < s.CallTime)

select *
from
( select *, ROW_NUMBER() over (partition by calltype, callid, phone, calltype order by CallTime) n
    from @siplog where calltype = 2
 ) S
 where n = 1
union all
select *
from
( select *, ROW_NUMBER() over (partition by calltype, callid, phone, calltype order by CallTime) n
    from @siplog s where calltype = 1
     and not exists(select * from @siplog x where x.CallType = 2 and x.CallID = s.CallID and x.Phone = s.Phone )
 ) S
 where n = 1
7 май 13, 19:09    [14269884]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить