HQL выбирает идентификатор объекта с максимальным значением в группе

У меня есть эта маленькая сущность

class Order
{
    public long Id;
    public DateTime Date;
    public long ProductId;
}

Я хочу выбрать Id организации, которая имеет MAX(Date) среди заказов, сгруппированных по ProductId. Пара (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);

будет работать на меня. Есть ли лучшие решения?


person Mixer    schedule 30.10.2012    source источник
comment
не всегда так, что если кто-то изменит/обновит дату заказа, то ваш запрос не вернет правильный результат.   -  person Saboor Awan    schedule 30.10.2012
comment
100% правильно ;-) поэтому я прошу лучшее решение   -  person Mixer    schedule 31.10.2012


Ответы (2)


попробуйте самосоединение вместо запроса в для повышения производительности.

person Saboor Awan    schedule 30.10.2012

в запросе должна быть оптимизация, но это работает для вас.

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()));
        }
person Saboor Awan    schedule 31.10.2012