T-SLQ Можете ли вы использовать агрегат в предложении on? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть 2 таблицы вызовов. Таблица 1 содержит информацию о звонке / клиенте. В таблице 2 есть журналы вызовов, что произошло во время вызова. Мне нужно соединить таблицу 2 с таблицей 1, но вытащить только «Время» для первого телефона. В журнале вызовов есть несколько «Телефон», нужно время для первого.

Table 1                             Table 2                                       Goal

Call ID  Client  State            Call ID   Method     Time           Call ID   Client  State  Time
1        John    TX               1         Inbound    11:00          1         John    TX     11:01
2        Mike    CA               1         Phone      11:01          2         Mike    CA     11:31
3        Susan   NA               1         Answer     11:01          3         Susan   NA     ...   
4        ...     ....             1         Phone2     11:05          4
                                  1         Call End   11:22          .         etc
                                  2         Inbound    11:30
                                  2         Phone      11:31

Кинда хочет сделать что-то подобное.

SELECT *
FROM Table1 t1 on Table2 t2 = t1.call_id = t2.call_id and t2.Method like '%Phone%'

но это потянет все телефоны раз. Нужен МИН (телефон). Можете ли вы использовать агрегат в предложении on?

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Вы можете сделать это с помощью ROW_NUMBER() оконной функции:

select t1.*, t2.time
from table1 t1 inner join (
  select *, row_number() over (partition by callid order by time) rn
  from table2
  where method like '%Phone%'
) t2 on t2.callid = t1.callid
where t2.rn = 1

или:

select t1.*, 
  (select min(time) from table2 where method like '%Phone%' and callid = t1.callid) time
from table1 t1
0 голосов
/ 07 марта 2020

Нет, вы не можете использовать агрегацию в предложении on. Вместо этого используйте apply:

SELECT *
FROM Table1 t1 CROSS APPLY
     (SELECT TOP (1) t2.*
      FROM Table2 t2 
      WHERE t2.call_id = t1.call_id and 
            t2.Method like '%Phone%'
      ORDER BY phone
     ) t2;
...