比较行值

Fra*_*ena 2 subquery

我是 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)

我知道我在做一些非常愚蠢的事情,如果有人能指出这一点,我将不胜感激。

And*_*y M 6

源调用段在整个过程中没有变化。

你需要记住这一点,NameNumber保持不变。因此,您的 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每次调用的最终结果。列NameNumberSrc_Call_Leg并且Final_Dest_Call_Leg将保持跨越各组属于同一个呼叫行一样-所以主要选择组通过那些列,并使用具有过滤掉不具有中间组的派生表Dest_Call_Leg的匹配1000%模式。