У меня есть требование подсчитать все первые предложения, которые мы направили сотруднику, не имеет значения, сколько предложений мы расширили, требование - это просто первое предложение. Я написал этот код, чтобы зафиксировать это, но в тех случаях, когда мы продлили более одного предложения, он учитывается дважды. какие-либо предложения о том, что мне нужно настроить в моем коде, чтобы подсчитывать только один раз, независимо от того, сколько предложений было продлено?

(SELECT /*+ materialize */ 1 
FROM
(
  SELECT /*+ materialize */ 1, Rank() OVER(PARTITION BY EMP_NUM  order by CREATION_DT   asc) AS RECNUM
  FROM CTE_OFFERS ACP
  WHERE STS_NAME = 'Extended'
  AND  STEP_NAME = 'Offer'
  AND ACP.EMP_NUM  = EXT.EMP_NUM  
  AND ACP.TITLE = EXT.TITLE
 ) T2
    WHERE RECNUM=1
)  AS t1,
0
Sly 8 Окт 2018 в 15:32

2 ответа

Лучший ответ

Используйте функцию row_number(), удалите PARTITION BY EMP_NUM и примите во внимание следующее:

select * 
  from
  (
   with cte_offers( emp_num, creation_dt ) as
   (
    select 17, trunc(sysdate)   from dual union all
    select 18, trunc(sysdate)   from dual union all
    select 19, trunc(sysdate)+1 from dual     
   )
   select emp_num, row_number() over (order by creation_dt asc) as recnum
     from cte_offers
   )
 where recnum = 1
 order by emp_num;

EMP_NUM RECNUM
------- ------
  17       1

Даже если оба значения CREATION_DT одинаковы, это дает разные числа (recnum).

Rextester Demo

1
Barbaros Özhan 26 Дек 2018 в 15:11

Предполагая , что для любого сотрудника может быть только одно "первое" предложение, Чтобы получить все первые предложения, все, что вам нужно, это получить точное количество сотрудников, для которых было продлено какое-либо предложение:

select count(distinct emp_num)
from cte_offers
where sts_name = 'Extended'
and step_name = 'Offer';

Если вам нужно, чтобы количество первых предложений было распространено на одного сотрудника (т.е. задано emp_num), которое может быть либо 0, либо 1 согласно приведенному выше предположению:

select count(*)
from dual
where exists (
    select 1
    from cte_offers
    where sts_name = 'Extended'
    and step_name = 'Offer'
    and emp_num = ?
)
0
Gurwinder Singh 26 Дек 2018 в 15:29