Benutzer mit den meisten Antworten
LINQ Abfrage Summe alle 5 Minuten

Frage
-
Hallo zusammen,
kann mir einer sagen wie eine Abfrage aussehen kann/muss, um eine Liste wie folgt
ENDTIME COMP 2015-04-29 09:08:46.000 112 2015-04-29 09:08:42.000 168 2015-04-29 09:08:40.000 196 2015-04-29 09:08:26.000 112 2015-04-29 09:07:19.000 56 2015-04-29 09:07:09.000 532 2015-04-29 09:06:58.000 476 2015-04-29 09:06:46.000 308 2015-04-29 09:06:46.000 112 2015-04-29 09:06:43.000 168 2015-04-29 09:06:32.000 196 2015-04-29 09:06:16.000 112 2015-04-29 09:05:14.000 56 2015-04-29 09:05:00.000 532 2015-04-29 09:04:50.000 476 2015-04-29 09:04:47.000 308 2015-04-29 09:04:44.000 168
so aufzubereiten, dass ich eine Summe der COMP jede Minute zusammengefasst bekomme?
z.B.
2015-04-29 09:04:00.000 952
Später möchte ich auch alle 5 Minuten zusammenfassen.- Bearbeitet David Stania Mittwoch, 29. April 2015 07:30 Erweiterung
Antworten
-
Meine Lösung dafür schaut wie folgt aus
//Startzeit der Abfrage definieren DateTime datHistorie = DateTime.Now.AddHours(-48); //Abfrage ausführen var Komponenten = DBContext.PCBTRACE.Where(r => r.ENDTIME >= datHistorie).OrderBy(r => r.ENDTIME); //Datatable zum speichern der Abfragen DataTable dt = new DataTable(); dt.Columns.Add("Datum", typeof(DateTime)); dt.Columns.Add("Summe", typeof(decimal)); dt.Columns.Add("CPh", typeof(decimal)); //Größten Datumswert ermitteln var datMax = Komponenten.Max(r => r.ENDTIME).Value; //Minutenschritte definieren int datSchritt = 15; //Startdatum für Gruppierung/Summierung definieren DateTime datTempStart = Komponenten.Min(r => r.ENDTIME).Value.Round(SpecialFunctions.RoundType.QuaterHour); DateTime datTempEnde; while (datTempStart < datMax) { //Enddatum für Gruppierung/Summierung definieren datTempEnde = datTempStart.AddMinutes(datSchritt); //Abfrage ausführen var cphTemp = Komponenten.Where(r => r.ENDTIME >= datTempStart && r.ENDTIME < datTempEnde); //prüfen ob Datensätze vorhanden if (cphTemp.Count() > 0) { //Daten in Datatable einfühgen dt.Rows.Add(datTempEnde, cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault(), cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault() * (60 / datSchritt)); } else { dt.Rows.Add(datTempEnde, 0, 0); } // Neues Startdatum festlegen datTempStart = datTempStart.AddMinutes(datSchritt); } dataGridView1.DataSource = dt;
- Als Antwort markiert Aleksander Chalabashiev Montag, 11. Mai 2015 11:04
Alle Antworten
-
Hi,
für Linq kann ich dir das grade nicht sagen aber evtl. hilft dir auch die T-SQL Entsprechung.
SELECT DATEPART( YEAR, ENDTIME ) AS [Year], DATEPART( MONTH, ENDTIME ) AS [Month], DATEPART( DAY, ENDTIME ) AS [Day], DATEPART( HOUR, ENDTIME ) AS [Hour], ( DATEPART( MINUTE, ENDTIME ) / 1 ) AS [MinuteInterval], SUM( COMP ) AS SumComp FROM <Tabelle> GROUP BY DATEPART( YEAR, ENDTIME ), DATEPART( MONTH, ENDTIME ), DATEPART( DAY, ENDTIME ), DATEPART( HOUR, ENDTIME ), ( DATEPART( MINUTE, ENDTIME ) / 1 )
Die Idee dazu kommt von diesem Beitrag:
http://stackoverflow.com/questions/5002661/how-to-group-time-by-hour-or-by-10-minutes
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Mittwoch, 29. April 2015 08:17
-
Hallo Stefan,
danke für deine Antwort.
Ich nutze hier das EntityFramework und darf keine Änderungen an der DB vornehmen. Ich habe es nun mit herkömmlichen Mitteln hinbekommen ohne LINQ :-(
Ich hatte die Hoffnung mit wenigen Zeilen Code die Lösung zu schaffen. Nun sind es ein paar mehr geworden :-)
Danke und Gruß.
-
Hi,
es wäre natürlich nett, wenn Du uns deine Lösung zeigen könntest. Das würde anderen Usern, die eine ähnliche Frage habe, sicher helfen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Meine Lösung dafür schaut wie folgt aus
//Startzeit der Abfrage definieren DateTime datHistorie = DateTime.Now.AddHours(-48); //Abfrage ausführen var Komponenten = DBContext.PCBTRACE.Where(r => r.ENDTIME >= datHistorie).OrderBy(r => r.ENDTIME); //Datatable zum speichern der Abfragen DataTable dt = new DataTable(); dt.Columns.Add("Datum", typeof(DateTime)); dt.Columns.Add("Summe", typeof(decimal)); dt.Columns.Add("CPh", typeof(decimal)); //Größten Datumswert ermitteln var datMax = Komponenten.Max(r => r.ENDTIME).Value; //Minutenschritte definieren int datSchritt = 15; //Startdatum für Gruppierung/Summierung definieren DateTime datTempStart = Komponenten.Min(r => r.ENDTIME).Value.Round(SpecialFunctions.RoundType.QuaterHour); DateTime datTempEnde; while (datTempStart < datMax) { //Enddatum für Gruppierung/Summierung definieren datTempEnde = datTempStart.AddMinutes(datSchritt); //Abfrage ausführen var cphTemp = Komponenten.Where(r => r.ENDTIME >= datTempStart && r.ENDTIME < datTempEnde); //prüfen ob Datensätze vorhanden if (cphTemp.Count() > 0) { //Daten in Datatable einfühgen dt.Rows.Add(datTempEnde, cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault(), cphTemp.Sum(r => r.NUMCOMP).GetValueOrDefault() * (60 / datSchritt)); } else { dt.Rows.Add(datTempEnde, 0, 0); } // Neues Startdatum festlegen datTempStart = datTempStart.AddMinutes(datSchritt); } dataGridView1.DataSource = dt;
- Als Antwort markiert Aleksander Chalabashiev Montag, 11. Mai 2015 11:04