选择记录的最后一个实例但返回它的第一个实例

时间:2015-07-29 03:21:32

标签: sql sql-server

我的表包含来电记录。

callid  calling_pty dialed_num   disposition    dispvdn   segment     ucid
3862073 25555366    1001              1          1001        1  10000080561437527378
3862073 291113      1015              2          1015        2  10000080621437527416
3862074 635444419   1001              3          1001        1  10000081311437527892
3862075 25555596    1001              1          1001        1  10000081211437527803
3862075 26669       1014              3          1014        2  10000081231437527820
3862076 23044442    1009              2          1009        1  10000080961437527654
3862079 632444419   1001              1          1001        1  10000081361437527904
3862089 0111808     1001              1          1001        1  10000081671437528068
3862091 02366674    1001              1          1001        1  10000081011437527679
3862091 26666       1015              2          1015        2  10000081091437527712
3862097 63255529    1001              1          1001        1  10000081721437528139
3862097 29111       1014              3          1014        2  10000081771437528168

鉴于样本数据,我需要选择处置= 3的记录,但我需要首先检查它是否有较早的段[处置是呼叫的状态,3表示放弃,段是呼叫的数量实例,如果它在一次交易中被转移]。并返回第一个实例的calling_pty(调用者编号),因此如果没有,则返回该记录的编号。并且可以在callid的帮助下识别

所以使用给定的样本,

3862075 25555596    1001              1          1001        1  10000081211437527803
3862075 26669       1014              3          1014        2  10000081231437527820

它将返回给我" 25555596",它们具有相同的callid但不同的呼叫方,这意味着呼叫被转移然后它被放弃了。

因此:结果记录应该是" 25555596"记录。 *这适用于相同条件的所有记录,并将填充为列表

3862074 635444419   1001              3          1001        1  10000081311437527892
3862075 25555596    1001              1          1001        1  10000081211437527803
3862097 63255529    1001              1          1001        1  10000081721437528139

*这将是样本数据的最终结果

我做了一个嵌套的选择,但是在我将如何检查第一个实例的死胡同。有没有一个sql函数来实现这个?

1 个答案:

答案 0 :(得分:0)

我使用了两个相关的子查询:

SELECT callid, 
       (SELECT calling_pty 
        FROM Log l
        WHERE Log.callid = l.callid AND
              segment = (SELECT MIN(segment) 
                         FROM Log l2
                         WHERE l.callid = l2.callid) 
       )[calling_pty], 
       dialed_num, disposition, dispvdn, segment, ucid
FROM Log
WHERE disposition = 3

SQL Fiddle Demo