2017-02-03 68 views
2

我正在嘗試編寫一個T-SQL查詢,查找某個表在一段時間內的條目數量,然後按分鐘(條目/分鐘)對它們進行分組。 但我不能讓它顯示0條目的分鐘。按日期時間分鐘分組 - 在數據庫中顯示0條記錄的分鐘數?

我的查詢是這樣的:

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] 

什麼想法?

Edit1。例外輸出將顯示分鐘,表中沒有條目。另外,當發生這種情況時,查詢是不可用的,因爲我無法知道哪一分鐘沒有數據。例如,如果我需要800分鐘的數據,但20分鐘內沒有數據寫入表格,則只會顯示780分鐘的數據。無論如何要爲此目的對數據進行排序或修改查詢嗎?

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

中的每一行的結果是從您的輸入表的一行或多行產生。你不會得到零的行,因爲......沒有行來提供日期時間值。 –

+3

您可能需要加入日曆表才能記入差異未顯示在數據集中的分鐘數。 –

+0

請發佈您的表格架構和預期輸出。 – McNets

回答

0

您可以創建一個臨時表抱着你從1需要你有最大分鐘都分鐘(例如使用this tecnique),那麼你就可以留下臨時表更換空值加入你的數據表與零。

因此,您應該將所有分鐘與您的值一起列出,並在其他地方存儲數據和零。

下面是代碼:

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

我會在星期一嘗試。非常感謝! –

+0

哇!我無法控制自己,不得不立即嘗試,並像魅力一樣工作。再次感謝! –