SQL和JPQL查询-搜索具有给定日期按参数分组的所有记录

时间:2019-04-16 17:13:32

标签: sql database select jpql

我有一个与此表类似的表:

enter image description here

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

示例:选择日期为6.12.2019的所有物料,应按物料ID 日期最大的分组显示该日期的所有物料(或具有较早日期的物料)应该看起来像这样:

enter image description here

问题:我想按日期最大的 MaterialID 将结果分组。因此,在此示例中,我不想显示具有相同ID且具有较早日期的材料。

对于同一示例:

enter image description here

问题::如何使用SQL和JPQL建立类似的查询?因为我想在Hibernate中使用此查询,所以我还需要JPQL查询。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是"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