【问题标题】:SQL and JPQL query - searching all records grouping by parameter with the given dateSQL 和 JPQL 查询 - 搜索具有给定日期的参数分组的所有记录
【发布时间】:2019-09-06 20:46:18
【问题描述】:

我有一个类似这样的表格:

我想构建查询以搜索该表中具有给定日期(比如 5.12.2019)和更早日期但按materialID 分组的所有记录。

示例:选择日期为 6.12.2019 的所有材料应显示所有具有此日期的材料(或具有较早日期的材料)按材料 ID 分组 具有最大日期 结果应该是这样的:

问题:我想将我的结果按 MaterialID 与最大日期分组。所以在这个例子中,我不想显示具有相同 id 和较早日期的材料。

同样的例子:

问题:如何使用 SQL 和 JPQL 构建这样的查询?因为我想在 Hibernate 中使用这个查询,所以我还需要 JPQL 查询。

感谢您的帮助。

【问题讨论】:

    标签: sql database select jpql


    【解决方案1】:

    这是"top N per category" query 的一个特例。您想显示每个材料 ID 的最大日期。在 SQL 中(也适用于 JPQL):

    SELECT SUM(Amount), SUM(Price), MaterialId, MAX(Date)
    FROM t
    GROUP BY MaterialId
    

    请注意,使用这种技术,您不能同时显示 ID 或 MAX(ID),因为 ID 和日期不一定都是单调递增的。如果您仍然希望 ID 显示在您的示例中,请编写此 SQL 查询(我认为这不能在 JPQL 中完成):

    SELECT MAX(ID), SUM(Amount), SUM(Price), MaterialId, MAX(Date)
    FROM (
      SELECT last_value(ID) OVER (
        PARTITION BY MaterialId 
        ORDER BY Date, ID 
        RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
      ) AS ID,
      Amount,
      Price,
      MaterialId,
      SELECT last_value(Date) OVER (
        PARTITION BY MaterialId 
        ORDER BY Date, ID 
        RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
      ) AS Date
      FROM t
    ) t
    GROUP BY MaterialId
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多