在Birt报告中获取左边的重复行

问题描述 投票:2回答:1

我正在加入Birt的两个数据集。它是一个左外连接。下面是数据集的屏幕截图。

enter image description here

我需要左表的所有行的原因是我正在对左表的所有行的时间戳进行一些计算。如果终端Id与左表匹配,我需要在右表中计算优先级(发生的次数)。

当我得到记录时,它会获得重复记录,这会导致我的时间戳计算加倍。我无法进行内连接,因为我需要从左表中进行时间戳计算。

两个表的关系有很多对很多。我将用例子解释我面临的问题是什么,以及我想要实现的目标。例如。这是DeviceEventObject数据集事件的数据:

记录1:

    "event" : "EXITED SUPERVISOR MODE",
        "timestamp" : ISODate("2017-12-17T06:06:23.181Z"),
  "terminal" : {
            "terminalId" : "testterminal",
            "branchId" : "test"
        }

记录2:

 "event" : "ENTERED SUPERVISOR MODE",
        "timestamp" : ISODate("2017-12-17T06:06:23.181Z"),
  "terminal" : {
            "terminalId" : "testterminal",
            "branchId" : "test"
        }

从这个每个事件的时间戳我计算输入和退出事件之间的时间。

现在其他数据集是DeviceStatusErrorCodePrioirtyLevel:例如。这是此数据集中的记录:

"status" : "Online",
    "errorCode" : "123",
    "priorityLevel" : "test",
    "emailTypeCode" : "123",
    "terminal" : {
        "terminalId" : "testterminal",
        "branchId" : "test"
    }

现在我想计算terminalId“testterminal”发生优先级“test”的次数。以上数据集计数将为1.我在terminalId的基础上加入这两个数据集。

现在使用上面的数据集,我得到重复的记录,这使我计算的时间加倍,并且我得到了优先级2的计数。例如,这就是我得到的:

"event" : "EXITED SUPERVISOR MODE",   "priorityLevel" : "test"
"event" : "ENTERED SUPERVISOR MODE", "priorityLevel" : "test"

我想要的是:

 "event" : "EXITED SUPERVISOR MODE",   "priorityLevel" : "test"
    "event" : "ENTERED SUPERVISOR MODE", 

birt项目的其他信息:

enter image description here

来自两个数据集的样本数据:

DeviceStatusErrorCodePrioirtyLevel:

{
    "_id" : ObjectId("5a36095f1854ad0b7096184b"),
    "className" : "com.omnia.pie.cm.models.snapshot.terminal.v2.DeviceStatusErrorCodePrioirtyLevel",
    "timestamp" : ISODate("2017-12-17T06:06:23.181Z"),
    "deviceName" : "CardReader",
    "status" : "Online",
    "errorCode" : "123",
    "priorityLevel" : "test",
    "emailTypeCode" : "123",
    "terminal" : {
        "terminalId" : "testterminal",
        "branchId" : "test"
    }
}

DeviceEventObject:

{
    "_id" : ObjectId("5a3608c61854ad0b70961846"),
    "className" : "com.omnia.pie.cm.models.snapshot.terminal.v2.DeviceEventObject",
    "event" : "EXITED SUPERVISOR MODE",
    "value" : "True",
    "timestamp" : ISODate("2017-12-17T06:03:50.901Z"),
    "transactionData" : {
        "transactionType" : "",
        "transactionNumber" : "",
        "sessionId" : ""
    },
    "terminal" : {
        "terminalId" : "testterminal",
        "branchId" : "test"
    }
}

以下是我的报告的链接:https://drive.google.com/file/d/1dHOEneG2-fbeP9Mz86LUhuk0tSxnLZxi/view?usp=sharing

eclipse mongodb reporting-services birt business-intelligence
1个回答
2
投票

为DeviceEventObject添加新数据集

在命令表达式构建器中添加以下聚合函数。

下面的函数$lookup来自状态错误代码优先级的数据基于terminalId,后跟$unwind来压平数据。

$group在terminalId上展平数据,以累积终端ID的不同优先级。

$project计算不同的优先级

[{$lookup:{
        from: "devicestatuserrorcodeprioirtylevel", // name of the collection
        localField: "terminal.terminalId",
        foreignField: "terminal.terminalId",
        as: "dsecpl"
}},
{$unwind:"$dsecpl"},
{$group:{
    "_id":"$terminal.terminalId", 
    "prioritylevels":{"$addToSet":"$dsecpl.priorityLevel"},
    "events":{"$push":"$event"}
}},
{"$project":{"prioritylevelcount":{"$size":"$prioritylevels"}, "events": 1} }
]

将所有可用字段移动到选定的字段列。

预览结果。

© www.soinside.com 2019 - 2024. All rights reserved.