如何按嵌套多重集中的值排序?

2023-12-31

An 先前的问题 https://stackoverflow.com/questions/69552492/jooq-multiset-order-result-set-via-conditions-on-multiset涵盖如何使用 jOOQMULTISET_AGG基于嵌套集合上的聚合函数对查询进行排序的功能:使用GROUP BY按父表中所有选定的列对查询进行分组,而不是尝试利用MULTISET.

是否有一种适用于多级集合的方法?我正在使用 PostgreSQL,但显然如果有一种独立于引擎的方法来做到这一点,那就更好了。

例如,如果我有一个使用的嵌套查询MULTISET:

var results =
    create
        .select(
            ORGANIZATIONS.ID,
            ORGANIZATIONS.NAME,
            multiset(
                    select(
                        DEPARTMENTS.ID,
                        DEPARTMENTS.NAME,
                        multiset(
                            select(EMPLOYEES.ID, EMPLOYEES.SALARY, EMPLOYEES.NAME)
                                .from(EMPLOYEES)
                                .where(EMPLOYEES.DEPARTMENT_ID.eq(DEPARTMENTS.ID)))))
                .from(DEPARTMENTS)
                .where(DEPARTMENTS.ORGANIZATION_ID.eq(ORGANIZATIONS.ID)))
        .from(ORGANIZATIONS)
        .fetch();

如果我输入一个,我可以轻松地按薪水对每个部门的员工进行排序ORDER BY在最里面的查询中。

                        multiset(
                            select(EMPLOYEES.ID, EMPLOYEES.SALARY, EMPLOYEES.NAME)
                                .from(EMPLOYEES)
                                .where(EMPLOYEES.DEPARTMENT_ID.eq(DEPARTMENTS.ID))
                                .orderBy(EMPLOYEES.SALARY.desc()))))

但是,我如何按最高员工工资对部门列表进行排序,以及按各部门最高员工工资对组织列表进行排序?

改变MULTISETs into MULTISET_AGGs并且只做ORDER BY在查询的顶层,就像前面的问题中只有一层嵌套一样,似乎它在这里不起作用,因为您需要同时按两组不同的列进行分组,而且还因为您不能嵌套聚合函数(至少在 PostgreSQL 上)。


我想不出一种简单的方法来聚合这些总和而不访问某些表两次。如果我这样做,我会更新这个答案。但这里有一个解决方案可以回答您的问题:

var results = create
    .select(
        ORGANIZATIONS.ID,
        ORGANIZATIONS.NAME,
        multiset(
            select(
                DEPARTMENTS.ID,
                DEPARTMENTS.NAME,

                // Employees per department sorted by salary
                multisetAgg(EMPLOYEES.ID, EMPLOYEES.SALARY, EMPLOYEES.NAME)
                    .orderBy(EMPLOYEES.SALARY.desc()))
           .from(DEPARTMENTS)
           .leftJoin(EMPLOYEES)
               .on(EMPLOYEES.DEPARTMENT_ID.eq(DEPARTMENTS.ID))
           .where(DEPARTMENTS.ORGANIZATION_ID.eq(ORGANIZATIONS.ID))
           .groupBy(DEPARTMENTS.ID, DEPARTMENTS.NAME)

           // Departments sorted by max employee salary
           .orderBy(max(EMPLOYEES.SALARY).desc()))
    .from(ORGANIZATIONS)

    // Organisations sorted by max employee salary via extra join
    .orderBy(field(
        select(max(EMPLOYEES.SALARY))
        .from(EMPLOYEES)
        .where(EMPLOYEES.departments().ORGANIZATION_ID.eq(ORGANIZATION.ID))
    ).desc())
    .fetch();

另一种解决方案是仅在查询后对外部结果进行排序:

var results = create
    .select(
        ORGANIZATIONS.ID,
        ORGANIZATIONS.NAME,
        multiset(
            select(
                DEPARTMENTS.ID,
                DEPARTMENTS.NAME,
                multisetAgg(EMPLOYEES.ID, EMPLOYEES.SALARY, EMPLOYEES.NAME)
                    .orderBy(EMPLOYEES.SALARY.desc()),
                max(EMPLOYEES.SALARY))
           .from(DEPARTMENTS)
           .leftJoin(EMPLOYEES)
               .on(EMPLOYEES.DEPARTMENT_ID.eq(DEPARTMENTS.ID))
           .where(DEPARTMENTS.ORGANIZATION_ID.eq(ORGANIZATIONS.ID))
           .groupBy(DEPARTMENTS.ID, DEPARTMENTS.NAME)
           .orderBy(max(EMPLOYEES.SALARY).desc()))
    .from(ORGANIZATIONS)
    .fetch()
    .sortDesc(Comparator.comparing(
        // r.value3() is the outer multiset()
        r -> r.value3().isEmpty() 
           ? 0 

        // r.value3().get(0).value4() is the top max(EMPLOYEES.SALARY) value
           : r.value3().get(0).value4()
    ));

可以定义一个新的运算符,从 a 中再次提取值MULTISET,而不依赖于其 SQL/XML 或 SQL/JSON 序列化实现。或者,您可以使用自己的纯 SQL 模板 https://www.jooq.org/doc/latest/manual/sql-building/plain-sql-templating/,知道序列化实现是什么样的(知道它将来可能会发生微妙的变化)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何按嵌套多重集中的值排序? 的相关文章

随机推荐

  • 解析失败:Lcom/google/android/aidl/BaseStub;

    我更新了 implementation com android installreferrer installreferrer X from 1 1 2 to 2 0 然后开始收到此错误 Process com tomatedigital
  • 在struts 2中为字符串列表制作一个垂直的单选按钮列表?

    我正在使用一个 struts radio 标签 该标签填充了一个字符串列表 我正在使用的视图是 tr td td tr
  • 实体数据查询和内存泄漏

    我正在循环下载大量数据 但经过一些操作后 我删除了它们 但我看到内存分配增长得非常快 几秒钟就达到了 1GB 那么如何在每次迭代后进行清理呢 using var contex new DB var inputs contex AIMRInp
  • 客户端 Web 应用程序中的 GPG (PGP) 解密

    如何在 Web 应用程序的客户端解密某些加密数据 E g 数据以加密方式存储在服务器上 它使用公共 GPG 密钥进行加密 服务器将加密后的数据发送给客户端 客户端需要使用本地私钥对其进行解密 假设我能够将私钥传递给浏览器并使用 JavaSc
  • Mongo嵌入文档查询

    我有 2 个动态文档 class Tasks db DynamicDocument task id db UUIDField primary key True default uuid uuid4 name db StringField f
  • 带有闰秒的持续时间

    我需要在固定的日期时间在代码中安排任务 为此 我使用 ScheduledExecutorService 和方法schedule Runnable command long delay TimeUnit unit 如何根据闰秒计算此延迟 目前
  • 如何在asp.net中获取当前的windows用户?

    我尝试了很多代码 它在我的本地服务器上成功运行 但我尝试将远程服务器放在远程服务器上 他们得到另一个字符串 例如 IIS APPPOOL 服务器名称 我更改了 IIS 管理器中的某些设置 但失败了 我如何获取远程服务器中的用户名 我尝试了一
  • Silverlight转WCF跨域异常,但clientaccesspolicy.xml读取成功

    clientaccesspolicy xml
  • 常规静态类

    这个文件sample groovy 中的 static 有什么作用 static class froob 不管有没有 static groovy 代码都可以很好地编译 绝对没有区别 这种情况下的静电被忽略 为了进行测试 我创建了一个 gro
  • Pandas read_excel 返回 PendingDeprecationWarning

    我一直在使用以下命令将 Excel 文件导入为 Pandas 数据框read excel到目前为止 功能尚未出现明显问题 然而 我刚刚意识到 在最近的一些更新之后 我收到以下警告 usr local lib python3 7 site p
  • 如何使用 Java API 设置消息选择器?

    我正在尝试编写一个简单的测试用例 以根据消息属性从队列中提取消息 命中 7 5 0 3 QMgr 并使用 7 5 0 3 客户端 jar 我在网上看到的所有内容都表明我需要在打开队列时指定消息选择器 我对此很满意 但我只看到两种打开它的方法
  • 优化 PHP 字符串连接 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这篇文章实际上并不是一个问题 但分享
  • SQLSTATE[23000]:违反完整性约束:19 NOT NULL 约束失败:

    尝试在 Laravel 上创建一个待办事项列表应用程序 但是当我尝试单击按钮创建一个新的待办事项列表时 我收到此错误 SQLSTATE 23000 Integrity constraint violation 19 NOT NULL con
  • jQuery 中的 ConfigurationManager.AppSettings

    我正在使用 mvc3 c 配置管理器中的应用程序设置在控制器中运行良好 但我想在我的 jquery 中使用这些常量 有没有办法在 jQuery 中使用 ConfigurationManager AppSettings 提前致谢 希望这对您有
  • 多部分/表单数据与应用程序/八位字节流

    我正在创建一个简单的REST API用于上传文件 从其他 API 中我发现他们使用 multipart form data 内容类型 但对我来说 它看起来像 application octet stream 就简单多了 如果我不打算随文件发
  • 为什么alloc方法可以增加retain count

    当我们打电话时alloc对于一个类 我知道对象的计数将 1 例如 NSObject obj NSObject alloc obj的引用计数将为1 我阅读了源代码 但找不到一些代码可以告诉我为什么alloc可以添加引用计数 还有一些博客说al
  • 如何将依赖项注入存储库基类

    各种种类 EnableXXXRepositorySpring Data 的注释允许您为存储库指定自定义基类 该基类将用作存储库中方法的实现 如果这样的基类需要访问其他beanApplicationContext如何注射这些药物 它不能开箱即
  • 创建新数据库时的最佳 ANSI 选项

    我正在为我们的生产环境在 SQL Server 2012 上创建一个新数据库 当我使用 SQL Server Management Studio 中的 新数据库 选项并生成输出时 我得到 CREATE DATABASE AAA CONTAI
  • makefile:如何链接不同子目录中的目标文件并包含不同的搜索路径

    我想更改测试代码的位置 tsnnls test DKU c 并且我无法在 makefile 中进行更改以正确反映此文件夹更改 一些帮助将不胜感激 我有两个问题 1 如何链接不同子目录中的目标文件 2 包含不同的搜索路径 在我的示例中为 3
  • 如何按嵌套多重集中的值排序?

    An 先前的问题 https stackoverflow com questions 69552492 jooq multiset order result set via conditions on multiset涵盖如何使用 jOOQ