感谢昨夜小楼...
以下是昨夜小楼的简洁代码.select
a.cMeascode,
a.iEquimentId,
ScadaTime=convert(varchar(14),a.dtScadaTime,120)+'00:00',
max_val=max(a.nAloge),
time_at_max=min(a.dtScadaTime),
min_val=min(b.nAloge),
time_at_min=min(b.dtScadaTime)
from @t_scadaTMeas a join @t_scadaTMeas b on a.cMeascode=b.cMeascode and a.iEquimentId=b.iEquimentId and convert(varchar(14),a.dtScadaTime,120)=convert(varchar(14),b.dtScadaTime,120)
where a.nAloge=(select max(nAloge) from @t_scadaTMeas where cMeascode=a.cMeascode and iEquimentId=a.iEquimentId and convert(varchar(13),dtScadaTime,120)=convert(varchar(13),a.dtScadaTime,120))
and b.nAloge=(select min(nAloge) from @t_scadaTMeas where cMeascode=b.cMeascode and iEquimentId=b.iEquimentId and convert(varchar(13),dtScadaTime,120)=convert(varchar(13),b.dtScadaTime,120))
group by a.cMeascode,a.iEquimentId,convert(varchar(14),a.dtScadaTime,120)+'00:00'
/*
cMeascode iEquimentId ScadaTime max_val time_at_max min_val time_at_min
--------- ----------- ------------------- ------- ------------------------ ------- ------------------------
a1 1 2007-11-20 01:00:00 3.0 2007-11-20 01:01:03.000 1.0 2007-11-20 01:01:00.000
a1 1 2007-11-20 05:00:00 3.0 2007-11-20 05:01:00.000 1.0 2007-11-20 05:59:03.000
a2 2 2007-11-20 03:00:00 2.0 2007-11-20 03:21:03.000 1.0 2007-11-20 03:11:00.000
a3 3 2007-11-20 23:00:00 3.0 2007-11-20 23:01:00.000 3.0 2007-11-20 23:01:00.000
*/
以下是昨夜小楼的简洁代码.select
a.cMeascode,
a.iEquimentId,
ScadaTime=convert(varchar(14),a.dtScadaTime,120)+'00:00',
max_val=max(a.nAloge),
time_at_max=min(a.dtScadaTime),
min_val=min(b.nAloge),
time_at_min=min(b.dtScadaTime)
from @t_scadaTMeas a join @t_scadaTMeas b on a.cMeascode=b.cMeascode and a.iEquimentId=b.iEquimentId and convert(varchar(14),a.dtScadaTime,120)=convert(varchar(14),b.dtScadaTime,120)
where a.nAloge=(select max(nAloge) from @t_scadaTMeas where cMeascode=a.cMeascode and iEquimentId=a.iEquimentId and convert(varchar(13),dtScadaTime,120)=convert(varchar(13),a.dtScadaTime,120))
and b.nAloge=(select min(nAloge) from @t_scadaTMeas where cMeascode=b.cMeascode and iEquimentId=b.iEquimentId and convert(varchar(13),dtScadaTime,120)=convert(varchar(13),b.dtScadaTime,120))
group by a.cMeascode,a.iEquimentId,convert(varchar(14),a.dtScadaTime,120)+'00:00'
/*
cMeascode iEquimentId ScadaTime max_val time_at_max min_val time_at_min
--------- ----------- ------------------- ------- ------------------------ ------- ------------------------
a1 1 2007-11-20 01:00:00 3.0 2007-11-20 01:01:03.000 1.0 2007-11-20 01:01:00.000
a1 1 2007-11-20 05:00:00 3.0 2007-11-20 05:01:00.000 1.0 2007-11-20 05:59:03.000
a2 2 2007-11-20 03:00:00 2.0 2007-11-20 03:21:03.000 1.0 2007-11-20 03:11:00.000
a3 3 2007-11-20 23:00:00 3.0 2007-11-20 23:01:00.000 3.0 2007-11-20 23:01:00.000
*/
再次,非常感谢昨天晚上的小楼...select
a.cMeascode,
a.iEquimentId,
ScadaTime=convert(varchar(14),a.dtScadaTime,120)+'00:00',
avg(c.nAloge) avg_val,
max(a.nAloge) max_val,
max(a.dtScadaTime) time_at_max,
min(b.nAloge) min_val,
min(b.dtScadaTime) time_at_min
from t_scadaTMeas a join t_scadaTMeas b on a.cMeascode=b.cMeascode and a.iEquimentId=b.iEquimentId and convert(varchar(14),a.dtScadaTime,120)=convert(varchar(14),b.dtScadaTime,120)
Join t_scadaTMeas c on (a.cMeascode=c.cMeascode and a.iEquimentId=c.iEquimentId and convert(varchar(14),a.dtScadaTime,120)=convert(varchar(14),c.dtScadaTime,120))
where a.nAloge=(select max(nAloge) from t_scadaTMeas where cMeascode=a.cMeascode and iEquimentId=a.iEquimentId and convert(varchar(13),dtScadaTime,120)=convert(varchar(13),a.dtScadaTime,120))
and b.nAloge=(select min(nAloge) from t_scadaTMeas where cMeascode=b.cMeascode and iEquimentId=b.iEquimentId and convert(varchar(13),dtScadaTime,120)=convert(varchar(13),b.dtScadaTime,120))
group by a.cMeascode,a.iEquimentId,convert(varchar(14),a.dtScadaTime,120)+'00:00'
我以为失忆了,明明昨晚在CSDN没发言。
(
dtScadaTime datetime not null,
nAloge float null ,
iEquimentId integer not null,
cMeascode character(8) not null,
constraint PK_T_SCADAHOURMEAS primary key (dtScadaTime, iEquimentId, cMeascode)
)
go
insert into t_scadaTMeas values('2007/11/20 01:01:00', 1, 1, 'a1')
insert into t_scadaTMeas values('2007/11/20 01:01:03', 3, 1, 'a1')
insert into t_scadaTMeas values('2007/11/20 01:59:03', 3, 1, 'a1')insert into t_scadaTMeas values('2007/11/20 05:01:00', 3, 1, 'a1')
insert into t_scadaTMeas values('2007/11/20 05:01:03', 2, 1, 'a1')
insert into t_scadaTMeas values('2007/11/20 05:59:03', 1, 1, 'a1')insert into t_scadaTMeas values('2007/11/20 03:11:00', 1, 2, 'a2')
insert into t_scadaTMeas values('2007/11/20 03:21:03', 2, 2, 'a2')
insert into t_scadaTMeas values('2007/11/20 03:59:03', 1, 2, 'a2')insert into t_scadaTMeas values('2007/11/20 23:01:00', 3, 3, 'a3')
insert into t_scadaTMeas values('2007/11/20 23:01:03', 3, 3, 'a3')
insert into t_scadaTMeas values('2007/11/20 23:59:03', 3, 3, 'a3')
GOSELECT x.h dt_Hour,
x.i iEquimentId,
x.c cMeascode,
x.dt max_nAloge_time,
x.maxN max_nAloge,
y.dt min_nAloge_time,
y.minN min_nAloge,
avgN avg_nAloge
FROM
(SELECT MIN(dtScadaTime) dt,maxN,h,i,c,avg(nAloge) avgN
FROM t_scadaTMeas a
INNER JOIN
(SELECT MAX(nAloge) maxN,CONVERT(VARCHAR(13),dtScadaTime,120) h,iEquimentId i,cMeascode c
FROM t_scadaTMeas GROUP BY CONVERT(VARCHAR(13),dtScadaTime,120) ,iEquimentId,cMeascode
) b
ON h=CONVERT(VARCHAR(13),dtScadaTime,120) AND maxN=nAloge AND iEquimentId=i AND cMeascode=c
GROUP BY maxN,h,i,c
) x
INNER JOIN
(SELECT MIN(a.dtScadaTime) dt,minN,h,i,c
FROM t_scadaTMeas a
INNER JOIN
(SELECT MIN(nAloge) minN,CONVERT(VARCHAR(13),dtScadaTime,120) h,iEquimentId i,cMeascode c
FROM t_scadaTMeas GROUP BY CONVERT(VARCHAR(13),dtScadaTime,120) ,iEquimentId,cMeascode
) b
ON h=CONVERT(VARCHAR(13),dtScadaTime,120) AND minN=nAloge AND iEquimentId=i AND cMeascode=c
GROUP BY minN,h,i,c
) y
ON x.h=y.h AND x.i=y.i AND y.c=x.c
性能最高,高出昨夜小楼给出代码的两个数量级...
而可阅读性中等,特表示感谢! 改天重新开贴散分.
x.i iEquimentId,
x.c cMeascode,
x.dt max_nAloge_time,
x.maxN max_nAloge,
y.dt min_nAloge_time,
y.minN min_nAloge,
avgN
FROM
(SELECT Max(dtScadaTime) dt,maxN,h,i,c
FROM t_scadaTMeas a
INNER JOIN
(SELECT MAX(nAloge) maxN,CONVERT(VARCHAR(13),dtScadaTime,120) h,iEquimentId i,cMeascode c
FROM t_scadaTMeas GROUP BY CONVERT(VARCHAR(13),dtScadaTime,120) ,iEquimentId,cMeascode
) b
ON h=CONVERT(VARCHAR(13),dtScadaTime,120) AND maxN=nAloge AND iEquimentId=i AND cMeascode=c
GROUP BY maxN,h,i,c
) xINNER JOIN
(SELECT MIN(a.dtScadaTime) dt,minN,h,i,c
FROM t_scadaTMeas a
INNER JOIN
(SELECT MIN(nAloge) minN,CONVERT(VARCHAR(13),dtScadaTime,120) h,iEquimentId i,cMeascode c
FROM t_scadaTMeas GROUP BY CONVERT(VARCHAR(13),dtScadaTime,120) ,iEquimentId,cMeascode
) b
ON h=CONVERT(VARCHAR(13),dtScadaTime,120) AND minN=nAloge AND iEquimentId=i AND cMeascode=c
GROUP BY minN,h,i,c
) y ON x.h=y.h AND x.i=y.i AND x.c=y.c INNER JOIN
(SELECT avgN,h,i,c
FROM t_scadaTMeas a
INNER JOIN
(SELECT avg(nAloge) avgN,CONVERT(VARCHAR(13),dtScadaTime,120) h,iEquimentId i,cMeascode c
FROM t_scadaTMeas GROUP BY CONVERT(VARCHAR(13),dtScadaTime,120) ,iEquimentId,cMeascode
) b
ON h=CONVERT(VARCHAR(13),dtScadaTime,120) AND iEquimentId=i AND cMeascode=c
GROUP BY avgN,h,i,c
) zOn x.h=z.h AND x.i=z.i AND x.c=z.c