我有一个与此表类似的表:
我想构建查询以从该表中搜索给定日期(假设为5.12.2019)和更早的日期但按materialID
分组的所有记录。
示例:选择日期为6.12.2019的所有物料,应按物料ID 日期最大的分组显示该日期的所有物料(或具有较早日期的物料)应该看起来像这样:
问题:我想按日期最大的 MaterialID 将结果分组。因此,在此示例中,我不想显示具有相同ID且具有较早日期的材料。
对于同一示例:
问题::如何使用SQL和JPQL建立类似的查询?因为我想在Hibernate中使用此查询,所以我还需要JPQL查询。
感谢您的帮助。
答案 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