在 Birt 报告中获取左侧的重复行加入

Getting duplicate rows on left join in Birt reports

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

我需要左 table 的所有行的原因是我正在对左 table 的所有行的时间戳进行一些计算。如果终端 ID 与左侧 table.

匹配,我需要计算右侧 table 的优先级(发生了多少次)

当我获取记录时,它会获取重复的记录,这会导致我的时间戳计算加倍。 我无法进行内部联接,因为我需要从左侧 table 开始计算时间戳。

table 在多对多中的关系。我将举例说明我面临的问题是什么以及我想要实现的目标。 例如。这是 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"
    }
}

以下是我的报告 link,以防万一: 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} }
]

将所有可用字段移至所选字段列。

预览结果。