Создать список объектов в plsql - postgresql - PullRequest
0 голосов
/ 24 декабря 2018

Мне нужно создать список объектов в PL / SQL - postgres и вернуть его в виде таблицы пользователю.

Вот сценарий.У меня есть две таблицы с именем

create table ProcessDetails(
    processName varchar,
    processstartdate timestamp,
    processenddate timestamp);

create table processSLA(
    processName varchar,
    sla numeric);

Теперь мне нужно перебрать все записи в таблице processDetails и проверить, какие записи для каждого типа активности нарушили sla, в пределах sla и те, которые составляют более 80% от sla.

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

sample data from processdetails table

    ProcessName  processstartdate             processenddate   
----------------------------------------------------- 
    "Create"    "2018-12-24 13:11:05.122694"    null
    "Delete"    "2018-12-24 12:12:24.269266"    null
    "Delete"    "2018-12-23 13:12:31.89164"     null
    "Create"    "2018-12-22 13:12:37.505486"    null

    processSLA
       ProcessName  sla(in hrs) 
    ---------------------------------
       Create       1
       Delete       10

И вывод будет выглядеть примерно так

ProcessName  WithinSLA(Count)  BreachedSLA(Count) Exceeded80%SLA(Count)
---------------------------------------------------------------------
Create                 1                1              3
Delete                 1                2              1   

Ответы [ 2 ]

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

Вы можете объединить обе таблицы и использовать условное агрегирование на основе вычисления разницы между временными метками.

Примерно так:

SELECT count(CASE
               WHEN extract(EPOCH FROM pd.processenddate - pd.processstartdate) / 3600 < ps.sla * .8 THEN
                1
             END) "less than 80%",
       count(CASE
               WHEN extract(EPOCH FROM pd.processenddate - pd.processstartdate) / 3600 >= ps.sla * .8
                    AND extract(EPOCH FROM pd.processenddate - pd.processstartdate) / 3600 <= ps.sla THEN
                1
             END) "80% to 100%",
       count(CASE
               WHEN extract(EPOCH FROM pd.processenddate - pd.processstartdate) / 3600 > ps.sla THEN
                1
             END) "more than 100%"                
       FROM processdetails pd
            INNER JOIN processsla ps
                       ON ps.processname = pd.processname;
0 голосов
/ 24 декабря 2018

Для каждого SLA вы можете просмотреть все соответствующие детали процесса с помощью join.Связь между двумя объединенными таблицами, указанная в условии объединения.Для вашего примера будет работать using (processName).

Чтобы найти процессы, которые превысили SLA, скажите, что допустимая дата окончания меньше, чем фактическая дата окончания:

select  processName
,       count(case when det.processstartdate + interval '1 hour' * sla.hours >=
            coalesce(det.processenddate, now()) then 1 end) as InSLA
,       count(case when det.processstartdate + interval '1 hour' * sla.hours <
            coalesce(det.processenddate, now()) then 1 end) as BreachedSLA
,       count(case when det.processstartdate + interval '1 hour' * 0.8 * sla.hours <
            coalesce(det.processenddate, now()) then 1 end) as 80PercentSLA
from    processSLA sla
left join
        ProcessDetails det
using   (processName)
group by
        processName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...