Использование функции 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)