2013-10-27 3 views
0

Когда я больше года, как я могу выбрать месяц, для которого принадлежит максимальное значение?Как сгруппировать по одному члену и выбрать второй элемент?

Пожалуйста, обратите внимание на следующий код:

public class Data_Point 
{ 
    public int Month { get; set; } 
    public int Year { get; set; } 
    public int Value { get; set; } 
} 

static void Main(string[] args) 
{ 
    List<Data_Point> Data = new List<Data_Point>(); 
    Data.Add(new Data_Point() { Month = 0, Year = 0, Value = 99 }); 
    Data.Add(new Data_Point() { Month = 1, Year = 0, Value = 69 }); 

    // Max should relate to one record only. 
    var Max_Year = (from e in Data 
        group e by e.Year into y 
        select new { Month(e => e.Month), Year = y.Key, Value = y.Max(e => e.Value) }).ToList(); 
} 

Я знаю, что моя проблема не вполне возможно в SQL, но мне было интересно, если LINQ является более гибким здесь.

+0

почему не 'Data.Max (х => x.Year) .Month'! – Anirudha

+1

Ваш код запутан, попробуйте объяснить, что вы пытаетесь сделать. Вам нужен рекорд с самым высоким годом, включая месяц? – Guvante

+0

Что вы ожидаете/хотите видеть (используя цифры, приведенные в примере кода)? выберите новый {Month = y.Max (x => x.Month), Year = ...;? – pasty

ответ

1

Это решение. Однако, если есть два разных Data_Point с одинаковыми Value, равными максимальному году, оба из них возвращаются.

var Max_Year = 
      from d in Data 
      group d by d.Year into grouped_by_year 
      let maxOfYear = grouped_by_year.Max(p => p.Value) 
      from grp in grouped_by_year 
      where grp.Value == maxOfYear 
      select grp; 

Чтобы иметь только один Data_Point (например, первый улов):

var Max_Year = 
      from d in Data 
      group d by d.Year into grouped_by_year 
      select grouped_by_year.OrderByDescending(p=>p.Value).First(); 

Вы можете изменить последнюю строку, чтобы иметь Month и Year и только Max(Value):

select new { grp.Year, grp.Month, MaxValueOfTheYear = grp.Month,grp.Value }; 
+0

Когда я запустил этот код, q будет иметь две записи, которые являются неправильными. Вы получаете то же самое? – chhenning

+0

Да же результат. Но, честно говоря, ваш вопрос непонятен. Вы хотите макс, а также хотите месяц? Если это то, что вы ищете, потому что есть два разных месяца, вы получаете результат со счетом 2 – Alireza

+0

Может быть только один макс в год, и это максимальное значение будет принадлежать только одному месяцу. Следовательно, для моих тестовых данных результат должен иметь только одну запись. Это имеет смысл для вас? – chhenning

0
var Max_Year = (from e in Data 
       group e by e.Year into y 
       select new { Month = y.OrderByDescending(d => d.Value).First().Month, Year = y.Key, Value = y.Max(e => e.Value) }).ToList(); 
0

Прежде всего, в SQL вы можете группировать по одному столбцу и выбирать другие столбцы, используя min, max, average.

В LINQ вы можете сделать:

var maxMonthPerYear = Data 
    .GroupBy(d => d.Year) 
    .Select(grp => new { Y = grp.Key, M = grp.Max(grp => grp.Month) }); 
Смежные вопросы