如何使用 Anylogic 中的插入数据库查询基于另一列获取一列的唯一值?

Posted

技术标签:

【中文标题】如何使用 Anylogic 中的插入数据库查询基于另一列获取一列的唯一值?【英文标题】:How do I get unique values of one column based on another column using the insert database query in Anylogic? 【发布时间】:2022-01-19 07:43:44 【问题描述】:

如何使用查询基于另一列获取一列的唯一值?

我尝试过使用

(double)selectFrom(tasks).where(tasks.tasks_type.eq()).uniqueResult(tasks.task_cycle_time_hr);

我想自动执行此操作并确保正在读取 task_type 的所有值并返回每个 tasks_type 的唯一值!

对于列 task_type 中的所有值,我需要列 task_cycle_time_hr 中的唯一值。

【问题讨论】:

最好分享一个有问题的数据屏幕,并澄清你到底需要什么,我不太清楚。 【参考方案1】:

我真的不明白您为什么要尝试在一个查询中执行此操作。

如果您想获取每个任务类型(tasks_type 列)的周期时间(task_cycle_time_hr 列),只需在循环中查询每个可能的 tasks_type 值。如果您不知道这些先验,请查询任务类型值查询返回的每个值,这看起来像

for (String taskType : selectFrom(tasks).list(tasks.tasks_type))   
    double cycleTime = (double) selectFrom(tasks)
                      .where(db_table.tasks_type.eq(taskType))
                      .firstResult(tasks.task_cycle_time_hr);
    
    traceln("Task type " + taskType + ", cycle time " + cycleTime);

但这只是查询所有行并从每个行读取任务类型和周期时间值,因此您通常不会这样做:您只会有一个查询循环遍历所有完整行。 ..

List<Tuple> rows = selectFrom(tasks).list();

for (Tuple row : rows) 
    traceln("Task type " +
        row.get(tasks.tasks_type) + ", cycle time " + 
        row.get(tasks.task_cycle_time_hr));

NB:我假设您没有任何包含重复任务类型的行,因为这样整个练习就没有意义,除非您只想要 first 行每个任务类型的值,或者想要每个给定任务类型的循环时间值的某种聚合(例如,总和)。您正在尝试使用uniqueResult,这可能意味着如果恰好有一行(对于给定的任务类型)并且“否则没有结果”,则您想要获取一个值,但uniqueResult 如果存在则抛出异常(错误)不完全是一排(所以你不能像那样直接使用它)。在那种情况下,一种方法(还有其他方法,有些可能稍微好一点)是先进行计数以进行检查;例如像

for (String taskType : selectFrom(tasks).list(tasks.tasks_type)) 

    int rowCount = (int) selectFrom(tasks)
              .where(db_table.task.eq(taskType))
              .count();

    if (rowCount == 1) 
       double cycleTime = (double) selectFrom(tasks)
                      .where(db_table.tasks_type.eq(taskType))
                      .firstResult(tasks.task_cycle_time_hr);
    
       traceln("Task type " + taskType + ", unique cycle time " + cycleTime);
    

【讨论】:

【参考方案2】:

将您的 Excel 工作表导入 AnyLogi 内部数据库,然后使用数据库向导一步一步编写代码以检索您想要的数据

(double) selectFrom(data)
    .where(data.tasks.eq("T1"))
    .firstResult(data.task_cycle_time_hr)

【讨论】:

这没有捕捉到问题中关于获取任务类型的每个值的周期时间值的部分。

以上是关于如何使用 Anylogic 中的插入数据库查询基于另一列获取一列的唯一值?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Anylogic 中的基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?

如何使用 AnyLogic 中的循环事件触发条件转换?

如何在 GIS 空间中的 anylogic 中创建家庭和本地连接?

在 Anylogic 中避免数据库查询

如何使用anylogic中的参数变化从图表上的main获取某些数据?

AnyLogic:由速率和匹配变量定义的到达