我是 SQL 新手,希望得到一些帮助。
这是我的表:
ID Name Number Src_Call_Leg Dest_Call_Leg
-- ---- ------ ------------ -------------
1 John 5555 100 1000
2 John 5555 100 102
Run Code Online (Sandbox Code Playgroud)
该表存储呼叫记录。当呼叫 5555 时,系统首先接受源呼叫支路 100 和目的地呼叫支路 1000 以及最终目的地呼叫支路 102,然后由 John 应答。源调用段在整个过程中没有变化。
我想要的是仅显示具有名称、号码、源呼叫支路和最终目的地呼叫支路的数据,以记录临时呼叫支路以 1000 开头的记录。
我尝试这样做,但没有用。这是我的尝试:
select
tb.name,
tb.number,
tb.Src_Call,
tb.Dest_Call_leg
from
table tb
where
tb.Src_Call_Leg IN (
select
tb1.Src_Call_Leg
from
table tb1
where
tb1.Dest_Call_Leg like '1000%'
);
Run Code Online (Sandbox Code Playgroud)
我知道我在做一些非常愚蠢的事情,如果有人能指出这一点,我将不胜感激。
源调用段在整个过程中没有变化。
你需要记住这一点,Name
并Number
保持不变。因此,您的 IN 谓词应在匹配项中包含这些列:
(tb.name, tb.number, tb.Src_Call_Leg) IN (
SELECT
tb1.name, tb1.number, tb1.Src_Call_Leg
FROM
yourTable tb1
WHERE
tb1.Dest_Call_Leg LIKE '1000%'
)
Run Code Online (Sandbox Code Playgroud)
不过,并非所有 SQL 产品都支持元组比较,而且您还没有指定什么是您的,因此上述语法可能不适合您。
不过,还有一个最有可能奏效的替代方法:EXISTS 谓词。它会像这样:
EXISTS (
SELECT
*
FROM
yourTable tb1
WHERE
tb1.Dest_Call_Leg LIKE '1000%'
AND tb1.name = tb.name
AND tb1.number = tb.number
AND tb1.Src_Call_Leg = tb.Src_Call_Leg
)
Run Code Online (Sandbox Code Playgroud)
并且由于您还指定了您只Dest_Call_Leg
需要final ,您可能需要在主 WHERE 中使用此附加条件:
AND tb.Dest_Call_Leg NOT LIKE '1000%'
Run Code Online (Sandbox Code Playgroud)
因此,整个查询将如下所示:
SELECT
tb.name,
tb.number,
tb.Src_Call,
tb.Dest_Call_leg
FROM
yourTable tb
WHERE
EXISTS (
SELECT
*
FROM
yourTable tb1
WHERE
tb1.Dest_Call_Leg LIKE '1000%'
AND tb1.name = tb.name
AND tb1.number = tb.number
AND tb1.Src_Call_Leg = tb.Src_Call_Leg
)
AND tb.Dest_Call_Leg NOT LIKE '1000%'
;
Run Code Online (Sandbox Code Playgroud)
或者,如果您的 SQL 产品支持 LAST_VALUE() 等分析函数,您可以像这样实现请求:
SELECT
Name,
Number,
Src_Call_Leg,
Final_Dest_Call_Leg AS Dest_Call_Leg
FROM
(
SELECT
Name,
Number,
Src_Call_Leg,
Dest_Call_Leg,
LAST_VALUE(Dest_Call_Leg) OVER (
PARTITION BY Name, Number, Src_Call_Leg
ORDER BY ID ASC
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS Final_Dest_Call_Leg
FROM
yourTable tb1
) derived
GROUP BY
Name,
Number,
Src_Call_Leg,
Final_Dest_Call_Leg
HAVING
COUNT(CASE WHEN Dest_Call_Leg LIKE '1000%' THEN 1 END) > 0
;
Run Code Online (Sandbox Code Playgroud)
派生表计算Dest_Call_Leg
每次调用的最终结果。列Name
,Number
,Src_Call_Leg
并且Final_Dest_Call_Leg
将保持跨越各组属于同一个呼叫行一样-所以主要选择组通过那些列,并使用具有过滤掉不具有中间组的派生表Dest_Call_Leg
的匹配1000%
模式。