Почему функция min возвращает несколько строк - PullRequest
0 голосов
/ 08 октября 2018

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

(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,

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

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

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 голосов
/ 09 октября 2018

Используйте функцию 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...