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

Откуда:
Сообщений: 3
Доброго времени суток! Помогите, пожалуйста с запросом. Есть такая таблица телефонных звонков:
num time tel answ
11 10:26 0971111111 1
12 9:50 0952222222 0
13 9:33 0952222222 0
14 9:32 0971111111 0
15 9:25 0971111111 0

time - время звонка
tel - телефон
answ - если 0, то это пропущенный звонок, 1- принятый.
Мне нужно выбрать все пропущенные звонки. При чем только последний из них.И если абонент уже дозвонился, то не выбирать его. Что имею в виду - номер 0952222222 - есть две записи, у обеих answ=0. Значит мне подходит. Беру последнюю запись по времени 9:50 - у которой num=12. Номер 0971111111 - есть записи с answ=0, но есть одна с answ=1. Значит, этот номер мне не подходит. Итого, я должен выбрать только строку с num=12
21 дек 15, 17:26    [18590104]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом, пожалуйста  [new]
автор2015_12_21
Guest
Dimakrr2015,

SELECT c0.*
  FROM calls c0
 WHERE c0.answ = 0
   AND NOT EXISTS (SELECT *
          FROM calls c1
         WHERE c0.tel = c1.tel
           AND c1.time > c0.time
           AND c1.answ = 1)
   AND TIME = (SELECT MAX(TIME)
                 FROM calls c2
                WHERE c2.tel = c0.tel
                  AND c2.answ = 0)
21 дек 15, 17:34    [18590164]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом, пожалуйста  [new]
Dimakrr2015
Member

Откуда:
Сообщений: 3
огромное спасибо!
21 дек 15, 17:43    [18590229]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом, пожалуйста  [new]
Dimakrr2015
Member

Откуда:
Сообщений: 3
Сделал, как вы написали, но ругается, что Булеан не может быть равным Интежер:

SELECT c0.* FROM (SELECT det.detailnum, hist.idcallhistory3, det.idcalldetail, hist.starttime, det.starttime as starttimedetail, hist.is_answ, hist.dialednumber, hist.callerid, hist.callchain, det.dest_num
    FROM public.callhistory3 AS hist 
        LEFT JOIN public.calldetails AS det ON hist.idcallhistory3 = det.idcallhistory2 
            WHERE det.detailnum=1 AND hist.is_fromoutside AND (AGE(hist.starttime::date)<'1 day') ORDER BY  hist.starttime DESC, hist.idcallhistory3 DESC, det.idcalldetail, det.detailnum) c0
            WHERE c0.is_answ = FALSE AND c0.starttime = 
(SELECT MAX(c2.starttime) FROM (SELECT det.detailnum, hist.idcallhistory3, det.idcalldetail, hist.starttime, det.starttime as starttimedetail, hist.is_answ, hist.dialednumber, hist.callerid, hist.callchain, det.dest_num 
    FROM public.callhistory3 AS hist LEFT JOIN public.calldetails AS det ON hist.idcallhistory3 = det.idcallhistory2 
            WHERE det.detailnum=1   AND hist.is_fromoutside AND (AGE(hist.starttime::date)<'1 day') 
    ORDER BY  hist.starttime DESC, hist.idcallhistory3 DESC,  det.idcalldetail, det.detailnum) c2 
            WHERE c2.dialednumber = c0.dialednumber AND c2.is_answ = 0) 
23 дек 15, 13:49    [18599153]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом, пожалуйста  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
DECLARE @T TABLE(num INT, [time] TIME, tel VARCHAR(50), answ BIT);
INSERT @T(num,[time],tel,answ)VALUES
 (11,'10:26','0971111111',1)
,(12,'9:50','0952222222',0)
,(13,'9:33','0952222222',0)
,(14,'9:32','0971111111',0)
,(15,'9:25','0971111111',0);

SELECT *
FROM
(
 SELECT TOP(1) WITH TIES *
 FROM @T
 ORDER BY ROW_NUMBER()OVER(PARTITION BY tel ORDER BY [time] DESC)
) T
WHERE answ=0;
23 дек 15, 14:05    [18599259]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом, пожалуйста  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
DECLARE @T TABLE(num INT, [time] TIME, tel VARCHAR(50), answ BIT);
INSERT @T(num,[time],tel,answ)VALUES
 (11,'10:26','0971111111',1)
,(12,'9:50','0952222222',0)
,(13,'9:33','0952222222',0)
,(14,'9:32','0971111111',0)
,(15,'9:25','0971111111',0);



select top 1 t.* from @t t
join(
select tel,max(cast((answ) as int)) as answ 
from @T
group by tel
having max(cast((answ) as int))!=1
) a on a.tel = t.tel
order by t.time desc
23 дек 15, 17:21    [18600468]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить