I have two MySQL tables that are related. My purpose is to obtain the minimum values of each group and the dates associated with each minimum value found.
TABLE 1
> ------------+--------------+--------------+-----------+-----------------+
> -- Code -- | - IdGroup1 - | - IdGroup2 - | - State - | - NameProtocol -|
> ------------+--------------+--------------+-----------+-----------------+
> ZZ-100 | 11111111 | 1110000 | 1 | OSM1 |
> ------------+--------------+--------------+-----------+-----------------+
> ZZ-200 | 55555555 | 5550000 | 1 | OSM1 |
> ------------+--------------+--------------+-----------+-----------------+
> ZZ-300 | 99999999 | 9990000 | 1 | OSM1 |
Table 1 and 3 are related.
TABLE 3
> ---------------------+-------------------+----------------+
> -- NameProtocol -- | -- Description -- | -- Protocol -- |
> ---------------------+-------------------+----------------+
> ATC0 | d1 | UDP |
> ---------------------+-------------------+----------------+
> OSM1 | d2 | TCP |
> ---------------------+-------------------+----------------+
Table 2 is where the new values are recorded.
TABLE 2
> ---------+-----------------------+----------------+----------------+
> - Value -| ------- Date -------- | -- IdGroup1 -- | -- IdGroup2 -- |
> ---------+-----------------------+----------------+----------------+
> 10 | 2020-08-16 02:30:10 | 99999999 | 9990000 |
> ---------+-----------------------+----------------+----------------+
> 15 | 2020-08-16 02:31:10 | 99999999 | 9990000 |
> ---------+-----------------------+----------------+----------------+
> 20 | 2020-08-16 02:32:10 | 99999999 | 9990000 |
> ---------+-----------------------+----------------+----------------+
> 115 | 2020-08-16 02:31:20 | 55555555 | 5550000 |
> ---------+-----------------------+----------------+----------------+
> 120 | 2020-08-16 02:32:20 | 55555555 | 5550000 |
> ---------+-----------------------+----------------+----------------+
> 90 | 2020-08-16 02:35:20 | 11111111 | 1110000 |
> ---------+-----------------------+----------------+----------------+
> 100 | 2020-08-16 02:30:20 | 11111111 | 1110000 |
I have done many tests and I still manage to get the correct answer, the best approximation was obtained with the following query:
var query = Table2 //Outer Table
.Join(Table1, //Inner Table to join
p => new { p.IdGroup1, p.IdGroup2 }, //Condition from outer table
e => new { e.IdGroup1, e.IdGroup2 }, //Condition from inner table
(p, e) => new { //Result
Code = e.Code,
Value = p.Value,
Date = p.Date })
.GroupBy(gb => new { gb.Code })
.OrderBy(ob => ob.Key.Code)
.Select(s => new { Code = s.Key.Code,
Value = (double?)s.Min(a => a.Value),
Date = "?" }) // TODO: The date remains to be implemented.
.ToList();
The result of my query:
> -------------+-------------+------------+
> -- Code -- | -- Value -- | -- Date -- |
> -------------+-------------+------------+
> ZZ-100 | 90 | ? |
> -------------+-------------+------------+
> ZZ-200 | 115 | ? |
> -------------+-------------+------------+
> ZZ-300 | 10 | ? |
I just need to add the dates for each minimum value found. What should I do to be able to integrate it into my query?
Code:
var query = Table1
.Join(Table2.Where(w => (w.State == 1)),
h => new { h.IdGroup1, h.IdGroup2 },
p => new { p.IdGroup1, p.IdGroup2 },
(h, p) => new { h, p })
.Join(Table3.Where(w => (w.Protocol == "TCP")),
pt => pt.p.NameProtocol,
p => p.NameProtocol,
(pt, p) => new { pt, p })
.GroupBy(gb => new { gb.pt.p.Code })
.OrderBy(ob => ob.Key.Code)
.Select(s => new { Code = s.Key.Code,
Value = (double?)s.Min(a => a.pt.h.Value) })
.ToList();