在Birt报告中获取左边的重复行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Birt报告中获取左边的重复行相关的知识,希望对你有一定的参考价值。
我正在加入Birt的两个数据集。它是一个左外连接。下面是数据集的屏幕截图。
我需要左表的所有行的原因是我正在对左表的所有行的时间戳进行一些计算。如果终端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项目的其他信息:
来自两个数据集的样本数据:
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
为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} }
]
将所有可用字段移动到选定的字段列。
预览结果。
以上是关于在Birt报告中获取左边的重复行的主要内容,如果未能解决你的问题,请参考以下文章