在plsql中创建对象列表-Postgresql

时间:2018-12-24 10:07:07

标签: postgresql

我需要在PL / SQL-postgres中创建对象列表,并将其作为表返回给用户。

这是场景。我有两个叫

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

create table processSLA(
    processName varchar,
    sla numeric);

现在,我需要遍历processDetails表中的所有记录,并检查每种活动类型的哪些记录违反了sla,sla内以及sla占80%以上的记录。

我将需要帮助来了解如何遍历记录并创建一个集合,对于每个过程类型,我都需要详细信息。

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 :(得分:0)

对于每个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

答案 1 :(得分:0)

您可以连接两个表并根据时间戳之间的差异计算使用条件聚合。

类似的东西:

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;