sql 查询 按小时 分组数据解决方法
sql 查询 按小时 分组数据
我有这样表
id int
equ_Code varchar(25)
equ_Name nvarchar(255)
flux float
recordTime datetime
要查出一天内每小时 flux的值。flux 每小时的值等于当前小时内 最后条-当前小时内第一条
原始数据:
id equ_Code equ_Name flux recordTime
0 F1001 xxxxx 1004 2015-04-16 00:00:00.000
1 F1001 xxxxx 1006 2015-04-16 00:05:00.000
2 F1001 xxxxx 1004 2015-04-16 00:10:00.000
3 F1001 xxxxx 1004 2015-04-16 00:15:00.000
4 F1001 xxxxx 1004 2015-04-16 00:20:00.000
5 F1001 xxxxx 1010 2015-04-16 00:25:00.000
6 F1001 xxxxx 1014 2015-04-16 00:30:00.000
7 F1001 xxxxx 1014 2015-04-16 00:35:00.000
8 F1001 xxxxx 1016 2015-04-16 00:40:00.000
9 F1001 xxxxx 1026 2015-04-16 00:45:00.000
10 F1001 xxxxx 1036 2015-04-16 00:50:00.000
11 F1001 xxxxx 1046 2015-04-16 00:55:00.000
12 F1001 xxxxx 1056 2015-04-16 01:00:00.000
那么 0点内的数据 就是 1046-1004=42
结果这样
小时 equ_code equ_name flux
0 0001 “XXX” 0.999
1 0001 “XXX” 1.999
..
sql 语句怎么写 。求大神帮忙看看那!
------解决思路----------------------
------解决思路----------------------
------解决思路----------------------
不知道去不去掉F
我有这样表
id int
equ_Code varchar(25)
equ_Name nvarchar(255)
flux float
recordTime datetime
要查出一天内每小时 flux的值。flux 每小时的值等于当前小时内 最后条-当前小时内第一条
原始数据:
id equ_Code equ_Name flux recordTime
0 F1001 xxxxx 1004 2015-04-16 00:00:00.000
1 F1001 xxxxx 1006 2015-04-16 00:05:00.000
2 F1001 xxxxx 1004 2015-04-16 00:10:00.000
3 F1001 xxxxx 1004 2015-04-16 00:15:00.000
4 F1001 xxxxx 1004 2015-04-16 00:20:00.000
5 F1001 xxxxx 1010 2015-04-16 00:25:00.000
6 F1001 xxxxx 1014 2015-04-16 00:30:00.000
7 F1001 xxxxx 1014 2015-04-16 00:35:00.000
8 F1001 xxxxx 1016 2015-04-16 00:40:00.000
9 F1001 xxxxx 1026 2015-04-16 00:45:00.000
10 F1001 xxxxx 1036 2015-04-16 00:50:00.000
11 F1001 xxxxx 1046 2015-04-16 00:55:00.000
12 F1001 xxxxx 1056 2015-04-16 01:00:00.000
那么 0点内的数据 就是 1046-1004=42
结果这样
小时 equ_code equ_name flux
0 0001 “XXX” 0.999
1 0001 “XXX” 1.999
..
sql 语句怎么写 。求大神帮忙看看那!
------解决思路----------------------
;WITH CTE AS(
SELECT id,equ_Code,equ_Name,flux,recordTime,CONVERT(VARCHAR(13),recordTime,120)[hourstr]
,ROW_NUMBER()OVER(PARTITION BY equ_Code,equ_name,CONVERT(VARCHAR(13),recordTime,120)ORDER BY recordTime)RN
FROM TB
)
,CTE2 AS(
SELECT [hourstr],equ_Code,equ_name
,MIN(RN)MINRN
,MAX(RN)MAXRN
FROM CTE
GROUP BY equ_Code,equ_name,[hourstr]
)
SELECT CAST(RIGHT(T1.[hourstr],2)AS INT)[小时]
,T1.equ_Code,T1.equ_name
,T3.flux-T2.flux[flux]
FROM CTE2 T1
JOIN CTE T2 ON T1.equ_Code=T2.equ_Code AND T1.equ_name=T2.equ_name AND T1.[hourstr]=T2.[hourstr]AND T1.MINRN=T2.RN
JOIN CTE T3 ON T1.equ_Code=T3.equ_Code AND T1.equ_name=T3.equ_name AND T1.[hourstr]=T3.[hourstr]AND T1.MAXRN=T3.RN
------解决思路----------------------
WITH /* 测试数据
table1(id,equ_Code,equ_Name,flux,recordTime) as (
SELECT 0,'F1001','xxxxx',1004,'2015-04-16 00:00:00.000' UNION ALL
SELECT 1,'F1001','xxxxx',1006,'2015-04-16 00:05:00.000' UNION ALL
SELECT 2,'F1001','xxxxx',1004,'2015-04-16 00:10:00.000' UNION ALL
SELECT 3,'F1001','xxxxx',1004,'2015-04-16 00:15:00.000' UNION ALL
SELECT 4,'F1001','xxxxx',1004,'2015-04-16 00:20:00.000' UNION ALL
SELECT 5,'F1001','xxxxx',1010,'2015-04-16 00:25:00.000' UNION ALL
SELECT 6,'F1001','xxxxx',1014,'2015-04-16 00:30:00.000' UNION ALL
SELECT 7,'F1001','xxxxx',1014,'2015-04-16 00:35:00.000' UNION ALL
SELECT 8,'F1001','xxxxx',1016,'2015-04-16 00:40:00.000' UNION ALL
SELECT 9,'F1001','xxxxx',1026,'2015-04-16 00:45:00.000' UNION ALL
SELECT 10,'F1001','xxxxx',1036,'2015-04-16 00:50:00.000' UNION ALL
SELECT 11,'F1001','xxxxx',1046,'2015-04-16 00:55:00.000' UNION ALL
SELECT 12,'F1001','xxxxx',1056,'2015-04-16 01:00:00.000'
), */
t1 AS (
SELECT DatePart(hour,recordTime) 小时,
equ_code,
equ_name,
flux,
recordTime
FROM table1
WHERE recordTime >= '2015-04-16'
AND recordTime < '2015-04-17'
)
,s AS (
SELECT DISTINCT
小时,
equ_code,
equ_name
FROM t1
)
SELECT s.*,
tMax.flux-tMin.flux flux
FROM s
CROSS APPLY (
SELECT TOP 1 *
FROM t1
WHERE 小时 = s.小时
AND equ_code = s.equ_code
AND equ_name = s.equ_name
ORDER BY recordTime
) tMin
CROSS APPLY (
SELECT TOP 1 *
FROM t1
WHERE 小时 = s.小时
AND equ_code = s.equ_code
AND equ_name = s.equ_name
ORDER BY recordTime DESC
) tMax
小时 equ_code equ_name flux
----------- -------- -------- -----------
0 F1001 xxxxx 42
1 F1001 xxxxx 0
-- 如果 flux 一直是增量用这个
SELECT DatePart(hour,recordTime) 小时,
equ_code,
equ_name,
MAX(flux)-MIN(flux) flux
FROM table1
WHERE recordTime >= '2015-04-16'
AND recordTime < '2015-04-17'
GROUP BY DatePart(hour,recordTime),equ_code,equ_name
------解决思路----------------------
不知道去不去掉F
--不去掉F
select datepart(hour,recordtime) as 小时,equ_code,equ_name,max(flux)-min(flux) as flux
from 表名
group by equ_code,equ_name,datepart(hour,recordtime)
--去掉F
select datepart(hour,recordtime) as 小时,right(equ_code,len(equ_code)-1),equ_name,max(flux)-min(flux) as flux
from 表名
group by right(equ_code,len(equ_code)-1),equ_name,datepart(hour,recordtime)