HQL选择组内具有最大值的实体的ID

Posted

技术标签:

【中文标题】HQL选择组内具有最大值的实体的ID【英文标题】:HQL select ID of entity with max value within group 【发布时间】:2012-10-30 17:01:17 【问题描述】:

我有这个小实体

class Order

    public long Id;
    public DateTime Date;
    public long ProductId;

我想在由ProductId 分组的订单中选择具有MAX(Date) 的实体的Id。 对 (MAX(Date), ProductId) 不是唯一的,所以这个查询是错误的:

select o.Id 
from Order o 
where o.Date = 
   (select max(o2.Date) 
    from Order o2 
    where o2.ProductId = o.ProductId);

你有什么想法吗?

基本上我想要的是从组中获取最新的订单,所以如果我假设更大的Id == 更新的Order 这个:

select o 
from Order o 
where o.Id in 
   (select max(o2.Id) 
    from Order o2 
    group by o2.ProductId);

对我有用。有没有更好的解决方案?

【问题讨论】:

并非总是如此,如果有人更改/更新订单日期,那么您的查询将不会返回正确的结果。 100% 正确 ;-) 因此我要求更好的解决方案 【参考方案1】:

尝试 self join 而不是 in 查询以获得更好的性能。

【讨论】:

【参考方案2】:

查询需要优化,但它适合你。

List<Order> orders = GetOrders();

        var result = from o in orders
                      group o by new  o.ProductId  into ordGrouping
                      let MaxOrderDate = ordGrouping.Max(od=>od.Date)
                      let OrderID = ordGrouping.First(od=>od.Date.Equals(MaxOrderDate)).Id
                      select new 
                       
                          ProductId = ordGrouping.Key.ProductId, 
                          OrderId = OrderID,
                          OrderDate = MaxOrderDate
                      ;

        foreach (var item in result)
        
            Console.WriteLine(string.Format("Product ID:0, OrderId: 1 Date: 2", item.ProductId, item.OrderId, item.OrderDate.ToLongDateString() + item.OrderDate.ToLongTimeString()));
        

【讨论】:

以上是关于HQL选择组内具有最大值的实体的ID的主要内容,如果未能解决你的问题,请参考以下文章

hql 查询以检索具有最大日期值的数据

Hibernate HQL:当且仅当所有子实体都具有相同值的属性时,如何选择父实体?

HQL:如何选择某些列不同的所有实体?

MySQL组内排序取最大值

选择具有最大值的行的 ID

mysql组内排序取最大值