簡體   English   中英

使用SQL SERVER查詢為每小時(每小時)選擇前1名

[英]select top 1 for each hour (hour wise) using SQL SERVER query

我需要一個查詢來獲取一些在兩個日期時間之間按小時排列的記錄列表,並且我想從每個小時中獲取最后一條記錄,如果數據表中不存在數據,則需要按小時顯示,但是importwh默認值應該為零。

結果應該像下面這樣

SNO Startdate               enddate                 ImportWH  
1   2016-12-05 00:00:00.000 2016-12-05 00:59:59.000   0  
2   2016-12-05 01:00:00.000 2016-12-05 01:59:59.000   0  
3   2016-12-05 02:00:00.000 2016-12-05 02:59:59.000   0  
4   2016-12-05 03:00:00.000 2016-12-05 03:59:59.000   0  
5   2016-12-05 04:00:00.000 2016-12-05 04:59:59.000   0  
6   2016-12-05 05:00:00.000 2016-12-05 05:59:59.000   0  
7   2016-12-05 06:00:00.000 2016-12-05 06:59:59.000   0  
8   2016-12-05 07:00:00.000 2016-12-05 07:59:59.000   0  
9   2016-12-05 08:00:00.000 2016-12-05 08:59:59.000   0  
10  2016-12-05 09:00:00.000 2016-12-05 09:59:59.000   0  
11  2016-12-05 10:00:00.000 2016-12-05 10:59:59.000   0  
12  2016-12-05 11:00:00.000 2016-12-05 11:59:59.000   0  
13  2016-12-05 12:00:00.000 2016-12-05 12:59:59.000   0  
14  2016-12-05 13:00:00.000 2016-12-05 13:59:59.000   0  
15  2016-12-05 14:00:00.000 2016-12-05 14:59:59.000   0  
16  2016-12-05 15:00:00.000 2016-12-05 15:59:59.000   0  
17  2016-12-05 16:00:00.000 2016-12-05 16:59:59.000   0  
18  2016-12-05 17:00:00.000 2016-12-05 17:59:59.000   0  
19  2016-12-05 18:00:00.000 2016-12-05 18:59:59.000   0  
20  2016-12-05 19:00:00.000 2016-12-05 19:59:59.000   0  
21  2016-12-05 20:00:00.000 2016-12-05 20:59:59.000   0  
22  2016-12-05 21:00:00.000 2016-12-05 21:59:59.000   0  
23  2016-12-05 22:00:00.000 2016-12-05 22:59:59.000   0  
24  2016-12-05 23:00:00.000 2016-12-07 23:59:59.000   0  

例如數據

SNO Startdate               enddate                 ImportWH  
1   2016-12-05 00:00:00.000 2016-12-05 00:59:59.000   0.1  
2   2016-12-05 00:00:00.000 2016-12-05 00:59:59.000   0.1  
3   2016-12-05 00:00:00.000 2016-12-05 00:59:59.000   2  
4   2016-12-05 01:00:00.000 2016-12-05 01:59:59.000   1  
5   2016-12-05 01:00:00.000 2016-12-05 01:59:59.000   2   

應該是下面這樣的結果SNO Startdate enddate ImportWH

1   2016-12-05 00:00:00.000 2016-12-05 00:59:59.000   2 
1   2016-12-05 01:00:00.000 2016-12-05 01:59:59.000   2 

您要生成此列表嗎?

    DECLARE   @StartDate DATETIME=CONVERT(VARCHAR,GETDATE(),110)
    SELECT sv.number AS SNO,DATEADD(hh,sv.number-1,@StartDate) AS Startdate,DATEADD(SECOND,-1,DATEADD(hh,sv.number,@StartDate)) AS enddate,0 AS ImportWH
    FROM master.dbo.spt_values AS sv
    WHERE sv.type='P' AND sv.number BETWEEN 1 AND 24
SNO         Startdate               enddate                 ImportWH
----------- ----------------------- ----------------------- -----------
1           2016-12-07 00:00:00.000 2016-12-07 00:59:59.000 0
2           2016-12-07 01:00:00.000 2016-12-07 01:59:59.000 0
3           2016-12-07 02:00:00.000 2016-12-07 02:59:59.000 0
4           2016-12-07 03:00:00.000 2016-12-07 03:59:59.000 0
5           2016-12-07 04:00:00.000 2016-12-07 04:59:59.000 0
6           2016-12-07 05:00:00.000 2016-12-07 05:59:59.000 0
7           2016-12-07 06:00:00.000 2016-12-07 06:59:59.000 0
8           2016-12-07 07:00:00.000 2016-12-07 07:59:59.000 0
9           2016-12-07 08:00:00.000 2016-12-07 08:59:59.000 0
10          2016-12-07 09:00:00.000 2016-12-07 09:59:59.000 0
11          2016-12-07 10:00:00.000 2016-12-07 10:59:59.000 0
12          2016-12-07 11:00:00.000 2016-12-07 11:59:59.000 0
13          2016-12-07 12:00:00.000 2016-12-07 12:59:59.000 0
14          2016-12-07 13:00:00.000 2016-12-07 13:59:59.000 0
15          2016-12-07 14:00:00.000 2016-12-07 14:59:59.000 0
16          2016-12-07 15:00:00.000 2016-12-07 15:59:59.000 0
17          2016-12-07 16:00:00.000 2016-12-07 16:59:59.000 0
18          2016-12-07 17:00:00.000 2016-12-07 17:59:59.000 0
19          2016-12-07 18:00:00.000 2016-12-07 18:59:59.000 0
20          2016-12-07 19:00:00.000 2016-12-07 19:59:59.000 0
21          2016-12-07 20:00:00.000 2016-12-07 20:59:59.000 0
22          2016-12-07 21:00:00.000 2016-12-07 21:59:59.000 0
23          2016-12-07 22:00:00.000 2016-12-07 22:59:59.000 0
24          2016-12-07 23:00:00.000 2016-12-07 23:59:59.000 0

方法1,可以得到不在組中的其他列,例如SNO:

WITH TB(SNO,Startdate,enddate ,ImportWH)AS(

   SELECT 1,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000', 0.1 UNION
   SELECT 2,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000',0.1  UNION
   SELECT 3,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000',2  UNION
   SELECT 4,'2016-12-05 01:00:00.000','2016-12-05 01:59:59.000',1  UNION
   SELECT 5,'2016-12-05 01:00:00.000','2016-12-05 01:59:59.000',2  
)
SELECT * FROM (
   SELECT *,ROW_NUMBER()OVER(PARTITION BY Startdate,enddate ORDER BY ImportWH desc) AS rn FROM tb
) t WHERE t.rn=1
SNO         Startdate               enddate                 ImportWH                                rn
----------- ----------------------- ----------------------- --------------------------------------- --------------------
3           2016-12-05 00:00:00.000 2016-12-05 00:59:59.000 2.0                                     1
5           2016-12-05 01:00:00.000 2016-12-05 01:59:59.000 2.0                                     1

方法2,按BY

WITH TB(SNO,Startdate,enddate ,ImportWH)AS(

   SELECT 1,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000', 0.1 UNION
   SELECT 2,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000',0.1  UNION
   SELECT 3,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000',2  UNION
   SELECT 4,'2016-12-05 01:00:00.000','2016-12-05 01:59:59.000',1  UNION
   SELECT 5,'2016-12-05 01:00:00.000','2016-12-05 01:59:59.000',2  
)

SELECT Startdate,enddate,MAX(ImportWH) AS ImportWH FROM tb GROUP BY Startdate,enddate
Startdate               enddate                 ImportWH
----------------------- ----------------------- ---------------------------------------
2016-12-05 00:00:00.000 2016-12-05 00:59:59.000 2.0
2016-12-05 01:00:00.000 2016-12-05 01:59:59.000 2.0
declare @test table (sno int,startdate datetime,enddate datetime,importwh numeric(5,2))

insert into @test values (1,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000','0.1');  
insert into @test values (2,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000','0.1');  
insert into @test values (3,'2016-12-05 00:00:00.000','2016-12-05 00:59:59.000','2');
insert into @test values (4,'2016-12-05 01:00:00.000','2016-12-05 01:59:59.000','1');
insert into @test values (5,'2016-12-05 01:00:00.000','2016-12-05 01:59:59.000','2');

select '1',startdate,enddate,max(importwh) from @test group by startdate,enddate

據我了解,您希望每小時統計一次數據。

1,首先生成時間序列的基礎ID和Day(每個ID和day將生成相關的時間序列。2.與您的日期和分組時間進行合並,並使用最大ImportWH值)3.我修改了數據,添加了新的ID。

 WITH table1(SNO,ID,IDAliasname,createddate,ImportWH)AS(

        SELECT 48883,'867330022903407','SG2003',CONVERT(DATETIME,'2016-12-07 15:15:00.000'),45.266 UNION ALL
        SELECT 48884,'867330022903407','SG2003','2016-12-07 15:46:00.000',45.266 UNION ALL
        SELECT 48885,'867330022903407','SG2003','2016-12-07 16:02:00.000',45.266 UNION ALL
        SELECT 48886,'867330022903407','SG2003','2016-12-07 16:17:00.000',45.266 UNION ALL
        SELECT 48887,'867330022903408','SG2004','2016-12-07 15:15:00.000',45.266 UNION ALL
        SELECT 48888,'867330022903408','SG2004','2016-12-07 15:31:00.000',45.266 UNION ALL
        SELECT 48889,'867330022903408','SG2004','2016-12-07 15:46:00.000',45.266 UNION ALL
        SELECT 48890,'867330022903408','SG2004','2016-12-07 16:02:00.000',45.266 UNION ALL
        SELECT 48891,'867330022903408','SG2004','2016-12-07 16:17:00.000',45.266 UNION ALL
        SELECT 48892,'867330022903408','SG2004','2016-12-07 16:33:00.000',45.266
    )
    --SELECT * FROM table1
    SELECT  t.ID,t.IDAliasname,t.StartTime,t.EndTime,MAX(ImportWH) AS ImportWH FROM (
        SELECT d.dt,i.IDAliasname,i.ID,DATEADD(HOUR, sv.number-1,d.dt) AS StartTime,DATEADD(SECOND,-1, DATEADD(HOUR, sv.number,d.dt)) AS  EndTime
        FROM master.dbo.spt_values AS sv
        ,(SELECT DISTINCT CONVERT(VARCHAR,table1.createddate,110) AS dt FROM table1)  AS d
        ,(SELECT DISTINCT ID, IDAliasname FROM table1)  AS i
        WHERE sv.type='P' AND sv.number BETWEEN 1 AND 24
      ) AS t
    INNER JOIN table1 AS tt ON tt.IDAliasname=t.IDAliasname AND t.ID=tt.ID AND DATEDIFF(SECOND,t.StartTime,tt.createddate)>=0 AND DATEDIFF(SECOND,tt.createddate,t.EndTime)>=0
    GROUP BY t.ID,t.IDAliasname,t.StartTime,t.EndTime
ID              IDAliasname StartTime               EndTime                 ImportWH
--------------- ----------- ----------------------- ----------------------- ---------------------------------------
867330022903407 SG2003      2016-12-07 15:00:00.000 2016-12-07 15:59:59.000 45.266
867330022903407 SG2003      2016-12-07 16:00:00.000 2016-12-07 16:59:59.000 45.266
867330022903408 SG2004      2016-12-07 15:00:00.000 2016-12-07 15:59:59.000 45.266
867330022903408 SG2004      2016-12-07 16:00:00.000 2016-12-07 16:59:59.000 45.266

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM