【问题标题】:Getting duplicate rows on left join in Birt reports在 Birt 报告中获取左连接的重复行
【发布时间】:2017-12-14 07:56:14
【问题描述】:

我正在加入 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

【问题讨论】:

  • 我可以看看。你是如何设置 birt 报告的?你有没有学习任何教程?
  • 是的,我按照一些教程来设置 birt 项目,但目前我没有教程的链接。如果您有任何问题,可以问我。如果您能回答这个问题,我将非常感激。
  • @Veeram 我还有另一个问题也与 Birt 和 mongoDb 相关,并且有赏金,如果你想看看:stackoverflow.com/questions/47752325/…
  • 我很想这样做,但我不知道如何从这里开始。您是否下载了一些软件或者它是您使用的 Eclipse 插件?你是如何配置使用 eclipse 的?任何信息都会有所帮助。网上没有多少。如果您能找到对您有帮助的链接。
  • @Veeram 首先我下载了​​ eclipse-reporting-neon 然后我按照一些教程在 eclipse 中创建了 birt 项目(我会寻找链接)。我已更新问题以向您展示项目结构。创建报告不使用一些称为设计引擎 API 的 API,我只是使用 UI 和脚本将报告放在一起。我还在项目和eclipse lib文件夹中复制了一些jar文件来支持mongoDB。

标签: eclipse mongodb reporting-services birt business-intelligence


【解决方案1】:

为 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} }
]

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

预览结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多