Использование подзапроса в FROM вместо WHERE - SAP BO Web Intelligence - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь использовать конструктор запросов WebI для достижения чего-то, чего я уже могу достичь, написав чистый SQL-запрос.

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

Для этого я выбираю конкретные строки из таблицы аудита и использую функцию T-SQL LAG (), чтобы получить время предыдущего изменения группы (для этого уже есть объект в юниверсе). Из-за того, как работает LAG (), я выбираю все строки изменения группы (и запись создания) в качестве промежуточных результатов, чтобы можно было рассчитать время, в течение которого билет находился в любой группе (ticket = '...' просто ограничить). время выполнения при разработке):

SELECT 
    ticket,
    change_date,
    LAG(change_date) OVER (PARTITION BY ticket ORDER BY change_date) 'change_date_prev',
    CASE
        WHEN LAG(change_date) OVER (PARTITION BY ticket ORDER BY change_date) IS NULL THEN 0
        ELSE change_date-LAG(change_date) OVER (PARTITION BY ticket ORDER BY change_date)
    END AS duration,
    group_before,
    group_after
FROM audit_log
WHERE 
    ticket = 'cr:2792293'
    AND (
        aud_opr = 'create'
        OR changed_attr ='group'
    )

В результате получается что-то вроде этого:

ticket      change_date  change_date_prev  duration     group_before  group_after
------      -----------  ----------------  --------     ------------  -----------
cr:2792293  1554802730   NULL              0
cr:2792293  1554802808   1554802730        78           SUP-GroupA    OtherGroupA
cr:2792293  1554805870   1554802808        3062         OtherGroupA   OtherGroupB
cr:2792293  1554806322   1554805870        452          OtherGroupB   OtherGroupC
cr:2792293  1555319896   1554806322        513574       OtherGroupC   SUP-GroupA
cr:2792293  1555341997   1555319896        22101        SUP-GroupA    OtherGroupA
cr:2792293  1555343530   1555341997        1533         OtherGroupA   SUP-GroupA
cr:2792293  1555343625   1555343530        95           SUP-GroupA    SUP-GroupB
cr:2792293  1555344681   1555343625        1056         SUP-GroupB    OtherGroupA
cr:2792293  1555346162   1555344681        1481         OtherGroupA   SUP-GroupA
cr:2792293  1555346629   1555346162        467          SUP-GroupA    OtherGroupB
cr:2792293  1555346961   1555346629        332          OtherGroupB   OtherGroupC
cr:2792293  1555417764   1555346961        70803        OtherGroupC   SUP-GroupA
cr:2792293  1555419234   1555417764        1470         SUP-GroupA    SUP-GroupC
cr:2792293  1555424241   1555419234        5007         SUP-GroupC    SUP-GroupA
cr:2792293  1555513936   1555424241        89695        SUP-GroupA    SUP-GroupC

Теперь мне нужно уточнить этот набор результатов, чтобы получить два числа:

  1. Количество билетов, где group_before SUP-GroupA. На чистом SQL я бы использовал базовый запрос в качестве подзапроса для части FROM следующим образом (для визуализации отчета нужны оставшиеся столбцы), а затем просто подсчитал тикет в отчете:
SELECT
    *
FROM ( <base query> ) AS transfers
WHERE
    transfers.group_before = 'SUP-GroupA'
  1. Количество билетов, где group_before - это SUP-GroupA, group_after - это какая-то другая группа SUP- *, а продолжительность больше некоторого произвольного значения (опять же, оставляя счет для отчета):
SELECT
    *
FROM ( <base query> ) AS transfers
WHERE
    transfers.group_before = 'SUP-GroupA'
    AND transfers.group_after LIKE 'SUP-%'
    AND transfers.duration > 1234

Эти запросы отлично работают при выполнении их для БД, но независимо от того, какое колдовство я пытаюсь использовать в Web Intelligence и в юниверсе, я не могу заставить построитель запросов генерировать аналогичный запрос. Функции подзапроса в WebI, которые мне известны, делают подзапрос в предложении WHERE, но это не сработает для меня, так как функция LAG () работает со строками возвращаемого набора результатов, поэтому, если я отфильтрую их по простой запрос change_date_prev получит change_date из предыдущей возвращенной строки, а не из предыдущего изменения группы.

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

Нарушаю ли я ограничения Web Intelligence или есть способ обойти это без жесткого кодирования большого количества одноразовых объектов во вселенной?

1 Ответ

0 голосов
/ 18 апреля 2019

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

Если это невозможно, то я думаю, что единственный другой вариант - это создать производную таблицу во вселенной. Вам нужно добавить GROUP BY на ticket (и любые другие поля, которые могут использоваться в условиях), чтобы LAG работала правильно.

...