简体   繁体   English

使用SQL SERVER查询为每小时(每小时)选择前1名

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

I need one query to get some list of records hour wise between two date-time and I want to get last record from each hour, if data does not exist in the data-table then I need to show hour wise but importwh default value should be zero. 我需要一个查询来获取一些在两个日期时间之间按小时排列的记录列表,并且我想从每个小时中获取最后一条记录,如果数据表中不存在数据,则需要按小时显示,但是importwh默认值应该为零。

result should be like bellow 结果应该像下面这样

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  

for example data 例如数据

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   

should be result like bellow SNO Startdate enddate ImportWH 应该是下面这样的结果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 

Do you want to generate this list? 您要生成此列表吗?

    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

Mehtod 1,can get other column that not in group, such as SNO: 方法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

Method 2, Group BY 方法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

As my understand, you want to statistic data per hourly. 据我了解,您希望每小时统计一次数据。

1, First generate time serial base ID and Day(eacho ID and day will generating relating time serial. 2. Join with your date and group by hour, and use the max ImportWH value 3. I modified your data,added a new ID. 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