21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
1

Группировка таблицы с выбором записи, соответствующей максимальному значению

06.07.2016, 20:21. Показов 2168. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, написать LINQ-запрос.

Есть таблица DataTable:

FLDNAME FLDVAL VERSION
F1 a 1
F1 g 2
F1 s 3
F2 w 2
F2 q 4

Нужно сгруппировать таблицу по полю FLDNAME таким образом, чтобы в результирующую таблицу попали строки, содержащие максимальное значение поля VERSION.

То есть, после группировки должно получиться:
FLDNAME FLDVAL VERSION
F1 s 3
F2 q 4

Добавлено через 2 часа 19 минут
Замечание. В общем случае полей, за исключением ключевого (FLDNAME) и содержащего номер версии (VERSION) может быть много.

Добавлено через 1 час 19 минут
Исправлена ошибка в условии задачи.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2016, 20:21
Ответы с готовыми решениями:

Выборка записи по максимальному значению поля в запросе
Доброго дня! Среда: W7, Access 2010. Есть запрос q, выбирающий записи вида K1 K2 K3 K4 Sum...

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

Фильтрация по максимальному значению
Есть таблица: ИД регламент версия(регламента) 1 ТР101 1.1 ...

выборка по максимальному значению
Помогите написать запрос. допустим есть табличка Table1 ID | Date 1 | 1.1.2013 1 ...

6
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
07.07.2016, 12:49 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void Main(string[] args)
{
    List<Field> tbl = new List<Field>
    {
        new Field {Fldname = "F1", Version = 1},
        new Field {Fldname = "F1", Version = 2},
        new Field {Fldname = "F1", Version = 8},
        new Field {Fldname = "F2", Version = 5},
        new Field {Fldname = "F2", Version = 0},
        new Field {Fldname = "F3", Version = 6},
    };
 
    var res = from field in tbl
                group field by field.Fldname into fields
                select new Field { Fldname = fields.Key, Version = fields.Max(f => f.Version) };
 
    var res2 = tbl
        .GroupBy(f => f.Fldname)
        .Select(g => new Field() { Fldname = g.Key, Version = g.Max(f => f.Version) });
}
public class Field
{
    public string Fldname { get; set; }
    public int Version { get; set; }
}
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
07.07.2016, 16:20  [ТС] 3
Уважаемый BozKurt! Вы самое главное упустили - в результирующей таблице должны быть ВСЕ поля исходной таблицы.
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
07.07.2016, 19:04 4
Ivan215, на примере моей импровизированной таблицы - поля как раз таки все. Я показал лишь решение основного вопроса из тз:
Цитата Сообщение от Ivan215 Посмотреть сообщение
Нужно сгруппировать таблицу по полю FLDNAME таким образом, чтобы в результирующую таблицу попали строки, содержащие максимальное значение поля VERSION.
0
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
07.07.2016, 21:11  [ТС] 5
У Вас отсутствует и в исходной и в результирующей таблице поле FLDVAL. В этом-то как раз вся проблема и состоит. Я даже пример привел - что должно получиться в результате.

на примере моей импровизированной таблицы - поля как раз таки все
А поле FLDVAL где?
0
273 / 203 / 30
Регистрация: 18.08.2010
Сообщений: 229
08.07.2016, 12:34 6
Лучший ответ Сообщение было отмечено Ivan215 как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static void Main(string[] args)
{
    var tbl = new []
    {
        new {Fldname = "F1", Fldval = "a", Version = 1},
        new {Fldname = "F1", Fldval = "g", Version = 2},
        new {Fldname = "F1", Fldval = "s", Version = 8},
        new {Fldname = "F2", Fldval = "w", Version = 5},
        new {Fldname = "F2", Fldval = "q", Version = 0},
        new {Fldname = "F3", Fldval = "n", Version = 6}
    };
 
    var res = tbl.GroupBy(t => t.Fldname)
                  .Select(g =>
                  {
                        var maxField = g.OrderBy(m => m.Version).LastOrDefault();
 
                        return new
                        {
                            Fldname = g.Key,
                            Fldval = maxField.Fldval,
                            Version = maxField.Version
                        };
                  });
}
1
21 / 22 / 10
Регистрация: 03.07.2014
Сообщений: 398
08.07.2016, 19:49  [ТС] 7
Спасибо огромное, alexsave!

Добавлено через 55 минут
Для тех, кто пишет на VB.NET предлагаю отконвертированную версию решения alexsave:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        Dim Q_Res = _
            From RB In Tbl _
            Order By RB.Fldname, RB.Version
 _
            Group
                RB.Fldval, _
                RB.Version _
            By RB.Fldname _
 _
            Into Grp = Group, _
                FL = LastOrDefault()
 _
            Select _
                Fldname, _
                FL.Fldval, _
                FL.Version
1
08.07.2016, 19:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2016, 19:49
Помогаю со студенческими работами здесь

Выбор по максимальному значению
Нужно сделать что-то вроде такого: SELECT * FROM table WHERE id=MAX(id) Как реализовать, не...

Требуется найти В равное максимальному значению
Даны действительные a1,...,an Требуется найти В равное максимальному значению из чисел а1,...аn и...

Вывод графика по максимальному и минимальному значению Х
Здравствуйте, мне нужна небольшая помощь, т.к. запутался очень сильно. Проблема в графике, я не...

Выборка данных по максимальному значению одного из полей
Такой код select distinct wt.wayid, wt1.Info as 'Улица', wt2.Info as 'Дом' from ...

Найти номера элементов, соответствующих максимальному значению
В одномерном массиве, состоящем из n вещественных элементов, найти номера элементов,...

Какое значение одного вектора соответствует максимальному значению другого?
Есть 2 вектора Как найти такое значение t, при котором Q максимальное? Нужно написать программу


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru