Использование функции LAG или Other в предложении SUM

Я ищу руководство по Oracle SQL Query, с которым я боролся.

У меня есть таблица данных, которая содержит метки времени и номера билетов службы поддержки...

Каждый раз, когда технический специалист вносит изменения в заявку или регистрирует заметку, соответствующая отметка времени будет регистрироваться в базе данных вместе с номером заявки. То, что я пытаюсь выполнить, - это подсчитать первое вхождение номера заявки в каждой серии, и я не могу использовать его отдельно, потому что он не будет считать счет снова, если техник обработает билет позже в тот же день. Пожалуйста, обратитесь к приложенной фотографии.

http://s13.postimg.org/i5gx4l4nb/sample.jpg

Используя функцию задержки, я могу пометить заявки на уровне строк, но не могу добавить это в предложение SUM для достижения моей конечной цели.

CASE WHEN LAG(IPCS_AUDIT_HISTORY.ENTITYID,1) over (ORDER BY IPCS_AUDIT_HISTORY.HISTORYDATE)=IPCS_AUDIT_HISTORY.ENTITYID THEN 0 ELSE 1 END

Любые идеи или мысли о том, в каком направлении это принять?

SELECT
  UPPER(IPCS_PLANNER.PLANNERSURNAME || ', ' || IPCS_PLANNER.PLANNERFIRSTNAME) AS FULL_NAME,
  COUNT(DISTINCT IPCS_AUDIT_HISTORY.ENTITYID) AS TICKETS_COUNT,
  SUM(CASE WHEN LAG(IPCS_AUDIT_HISTORY.ENTITYID,1) over (ORDER BY IPCS_AUDIT_HISTORY.HISTORYDATE)=IPCS_AUDIT_HISTORY.ENTITYID THEN 0 ELSE 1 END) AS TOUCH_COUNT
FROM 
  IPCS_AUDIT_HISTORY,
  IPCS_PLANNER
WHERE
  IPCS_AUDIT_HISTORY.PLANNERID=IPCS_PLANNER.PLANNERID and
  TRUNC(IPCS_AUDIT_HISTORY.HISTORYDATE, 'IW')='30-DEC-13'
GROUP BY
  UPPER(IPCS_PLANNER.PLANNERSURNAME || ', ' || IPCS_PLANNER.PLANNERFIRSTNAME)

2 ответа

Решение

ОБНОВЛЕНО: попробуйте это так

SELECT full_name, 
       COUNT(DISTINCT entityid) ticket_count,
       COUNT(DISTINCT series) - COUNT(DISTINCT entityid) touch_count
  FROM
(
  SELECT plannerid, full_name, entityid, 
         rnum - ROW_NUMBER() OVER (PARTITION BY plannerid, entityid ORDER BY rnum) series
    FROM
  (  
    SELECT p.plannerid, 
           UPPER(p.plannersurname || ', ' || p.plannerfirstname) full_name,
           h.historydate, 
           h.entityid,
           ROW_NUMBER() OVER (PARTITION BY p.plannerid ORDER BY h.historydate) rnum
      FROM ipcs_audit_history h JOIN ipcs_planner p
        ON h.plannerid = p.plannerid
     WHERE h.historydate >= TO_DATE('30-DEC-13')
       AND h.historydate <  TO_DATE('30-DEC-13') + 1
  ) q
) p
 GROUP BY plannerid, full_name

Образец вывода:

| FULL_NAME | TICKET_COUNT | TOUCH_COUNT |
| ----------- | -------------- | ------------- |
| ДОУ, ДЖОН |            4 |           1 |

Вот демоверсия SQLFiddle

Я мог бы неправильно истолковать ваш вопрос, но я считаю, что вам просто нужно добавить ROWS BETWEEN на ваш SUM():

SUM(ColName) OVER(ORDER BY Col2 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
Другие вопросы по тегам