【问题标题】:list values ​that are duplicated more than 4 times列出重复超过 4 次的值
【发布时间】:2022-01-24 00:47:30
【问题描述】:

我在 2 个表之间进行连接,它们给我带来了有关系的 number_phone,并且我带来了这些重复的时间,但是,我试图为计数设置一个条件,以便它只列出那些重复超过 4 次,我尝试使用帐户,它使我的计数器全部为空。 值得一提的是,我没有为计数占用 group by,因为它给我带来了错误的值。

SELECT
    REPLACE(REPLACE(t.id_contrato,'0999',''),'0998','')as contrato , 
    t.num_telefono,
    conc.valor_actual,
    (
        SELECT COUNT('x') 
        FROM TBL_TELEFONO ct 
        WHERE ct.num_telefono = t.num_telefono
        AND ct.origen_tel='TELEFONO CONTRATO' 
        -- HAVING COUNT(*) > 4 
    ) as counter 
FROM TBL_TELEFONO t
INNER JOIN  CAM_TBL_ALERTA_CONCENTRADO conc ON t.num_telefono = conc.valor_actual 
WHERE id_contrato IS NOT NULL
AND id_contrato NOT IN ('N/A')
ORDER BY 4 DESC

如何只列出重复超过 4 次的那些?

【问题讨论】:

  • 您可能需要分组但电话,添加have子句并通过电话将主查询与子查询相关联。

标签: sql oracle


【解决方案1】:

我不喜欢在没有示例数据的情况下调试代码,因此我将尝试在 Scott 的示例 EMP 表中对其进行说明。 “工作”就像您的“电话号码”一样。

SQL> select deptno, ename, job
  2  from emp
  3  order by job;

    DEPTNO ENAME      JOB
---------- ---------- ---------
        20 SCOTT      ANALYST    --> 2 analysts
        20 FORD       ANALYST
        10 MILLER     CLERK      --> 4 clerks
        30 JAMES      CLERK
        20 SMITH      CLERK
        20 ADAMS      CLERK
        30 BLAKE      MANAGER    --> 3 managers
        20 JONES      MANAGER
        10 CLARK      MANAGER
        10 KING       PRESIDENT  --> 1 president
        30 TURNER     SALESMAN   --> 4 salesmen
        30 MARTIN     SALESMAN
        30 WARD       SALESMAN
        30 ALLEN      SALESMAN

14 rows selected.

SQL>

据此,我们想获取所有的文员和销售员,因为他们有 4 个(或更多)。

代替count聚合函数,使用count分析形式:

SQL> select deptno, ename, job,
  2    count(*) over (partition by job) cnt
  3  from emp
  4  order by job;

    DEPTNO ENAME      JOB              CNT
---------- ---------- --------- ----------
        20 SCOTT      ANALYST            2
        20 FORD       ANALYST            2
        10 MILLER     CLERK              4
        30 JAMES      CLERK              4
        20 SMITH      CLERK              4
        20 ADAMS      CLERK              4
        30 BLAKE      MANAGER            3
        20 JONES      MANAGER            3
        10 CLARK      MANAGER            3
        10 KING       PRESIDENT          1
        30 TURNER     SALESMAN           4
        30 MARTIN     SALESMAN           4
        30 WARD       SALESMAN           4
        30 ALLEN      SALESMAN           4

14 rows selected.

SQL>

现在事情变得更容易了:将该查询用作 CTE(或子查询),并应用 where 子句:

SQL> with temp as
  2    (select deptno, ename, job,
  3       count(*) over (partition by job) cnt
  4     from emp
  5    )
  6  select deptno, ename, job
  7  from temp
  8  where cnt >= 4
  9  order by job;

    DEPTNO ENAME      JOB
---------- ---------- ---------
        10 MILLER     CLERK
        30 JAMES      CLERK
        20 SMITH      CLERK
        20 ADAMS      CLERK
        30 TURNER     SALESMAN
        30 MARTIN     SALESMAN
        30 WARD       SALESMAN
        30 ALLEN      SALESMAN

8 rows selected.

SQL>

应用于您的查询(同样,没有任何样本数据无法对其进行测试):

with temp as
  (select
     replace(replace(t.id_contrato,'0999',''),'0998','')as contrato , 
     t.num_telefono,
     conc.valor_actual,
     count(*) over (partition by t.num_telefono) as counter 
   from tbl_telefono t
   inner join  cam_tbl_alerta_concentrado conc on t.num_telefono = conc.valor_actual 
   where id_contrato is not null
     and id_contrato not in ('N/A')
  )
select contrato, num_telefono, valor_actual
from temp
where counter >= 4;

【讨论】:

  • 谢谢,成功了。
  • 不客气。
【解决方案2】:

加入超过 4 个的选择

SELECT
    REPLACE(REPLACE(t.id_contrato,'0999',''),'0998','')as contrato , 
    t.num_telefono,
    conc.valor_actual,
    ct.counter 
FROM TBL_TELEFONO t
INNER JOIN (
    SELECT num_telefono, COUNT(*) AS counter
    FROM TBL_TELEFONO  
    WHERE origen_tel='TELEFONO CONTRATO' 
    GROUP BY num_telefono
    HAVING COUNT(*) > 4 
) ct 
   ON ct.num_telefono = t.num_telefono
INNER JOIN CAM_TBL_ALERTA_CONCENTRADO conc 
   ON t.num_telefono = conc.valor_actual 
WHERE id_contrato IS NOT NULL
  AND id_contrato NOT IN ('N/A')
ORDER BY ct.counter DESC

【讨论】:

    【解决方案3】:

    将查询包装在另一个中以仅在 count > 4 时返回

    select *
    from (
        <your query, but without order by>
    ) x
    where count > 4
    order by count desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2020-07-28
      • 1970-01-01
      • 2019-04-12
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多