2017-02-03 1 views
2

Ich versuche eine T-SQL-Abfrage zu schreiben, die über einen bestimmten Zeitraum hinweg nach der Anzahl der Einträge in einer Tabelle sucht und sie dann nach Minuten gruppiert (Einträge/Minute). Aber ich kann es nicht bekommen, um die Minuten mit 0 Einträgen zu zeigen.Gruppieren nach datetime Minuten - Minuten mit 0 Einträgen in der Datenbank anzeigen?

Meine Anfrage wie folgt aussieht:

select 
[Minute], 
Files 
from 
(
    select 
     (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime)/1) as [Minute] , 
     count(*) as Files 
      from TransferLog 
      WHERE RegTime BETWEEN '2017-02-02 17:00:00.000' AND '2017-02-03 04:00:00.000' 
     group BY 
     (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime)/1) 
) x order by [Minute] 

Irgendwelche Ideen?

Edit1. Mit Ausnahme der Ausgabe werden Minuten ohne Einträge in der Tabelle angezeigt. Außerdem ist die Abfrage in diesem Fall ziemlich unbrauchbar, da ich nicht wissen kann, in welcher Minute keine Daten vorhanden waren. Wenn ich zum Beispiel Daten von 800 Minuten haben möchte, aber 20 der Minuten keine Daten in die Tabelle geschrieben haben, würde dies nur 780 Minuten an Daten anzeigen. Gibt es trotzdem eine Möglichkeit, die Daten zu sortieren oder die Abfrage zu modifizieren?

Expected output: 
Minute | Files 
0 685 
1 0 
2 672 
3 0 
4 415 
5 434 
6 746 

- 

Current Output: 
Minute | Files 
0 685 
1 672 
2 415 
3 434 
4 746 
+2

Jede Zeile in Ihr Ergebnis erzeugt wird, von einer oder mehreren Reihen aus Ihrer Eingabe-Tabellen. Sie erhalten keine Zeilen mit Nullen, weil ... es keine Zeile gibt, die diesen Datetime-Wert liefert. –

+3

Möglicherweise müssen Sie einer Kalender-Tabelle beitreten, um die Minuten einzulesen, deren Diffs nicht in Ihrem Datensatz erscheinen. –

+0

posten Sie bitte Ihr Tabellenschema und die erwartete Ausgabe. – McNets

Antwort

0

Sie können eine temporäre Tabelle erstellen, die alle Minuten halten Sie von 1 bis zur maximalen Minute benötigen Sie haben (zB mit this tecnique), dann können Sie Ihre Datentabelle verbinden linke Seite mit der temporären Tabelle Nullwerte ersetzt mit Nullen.

So sollten Sie alle Minuten mit Ihren Werten aufgelistet haben, wo Sie Daten und Nullen an anderer Stelle haben. Hier

ist der Code:

declare @max_minute  int 
declare @dataTable  table ([Minute] int, Files int) 

--insert your data into a temp table 
insert into @dataTable 
select [Minute], Files 
from 
(select 
     (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime)/1) as [Minute] , 
     count(*) as Files 
      from TransferLog 
      WHERE RegTime BETWEEN '2017-02-02 17:00:00.000' AND '2017-02-03 04:00:00.000' 
     group BY 
     (DATEDIFF(MINUTE, '2017-02-02 17:00:00.000', RegTime)/1) 
) x order by [Minute] 

--calculate maximum minute from your data 
select @max_minute = max([Minute]) from @dataTable 

; 
WITH gen AS (
    SELECT 1 AS Minute 
    UNION ALL 
    SELECT Minute+1 FROM gen WHERE Minute+1<[email protected]_minute 
) 
SELECT M.Minute, isnull(D.Files,0) as Files 
FROM gen M left join @dataTable D on M.Minute = D.Minute 
option (maxrecursion 10000) 
+0

Ich werde das am Montag versuchen. Ich danke dir sehr! –

+0

Wow! Ich konnte mich nicht beherrschen und musste es sofort versuchen und es funktionierte wie ein Zauber. Danke noch einmal! –

Verwandte Themen