我正在尝试从第二天早上5点到凌晨5点查询最大值。我还想在结果中开始查询日期。
这是我到目前为止所拥有的
Select Max(Value) as RWQ22003DTDDS from History
WHERE Datetime>='2009-08-21 05:00:00'
AND Datetime<='2009-08-22 05:00:00' and Tagname ='RWQ22003DTDDS'
我希望“2009-08-21”的日期出现在结果中。
datetime, value
------------------
2008-08-21, 2216
2008-08-20, 4312
等。 以前做了7天
更新:
这是我提出的另一个问题
declare @dec int
declare @SqlQry as varchar(4000)
declare @dd as nvarchar(50)
declare @ResolvedQry as varchar(4000)
set @dec = 0
set @SqlQry =''
WHILE (@dec <= 7)
BEGIN
set @dd = cast(datepart(mm,getdate()-@dec)as nvarchar) +'/'+
cast(datepart(dd,getdate()-@dec)as nvarchar) +'/'+
cast(datepart(yyyy,getdate()-@dec) as nvarchar)+' 06:00:00'
set @ResolvedQry = ' Select cast( convert(datetime,'''+@dd+''',102) as datetime) as [Date],
Max(Value) as RWQ22003DTDDS from History
WHERE Datetime>='''+ convert(varchar, dateadd(mi,5,convert(datetime,@dd,102))) +
''' and Datetime<='''+ convert(varchar, dateadd(mi,-5,convert(datetime,@dd,102)+1)) +'''
and Tagname =''RWQ22003DTDDS'''
if(@dec <7)
begin
set @ResolvedQry =@ResolvedQry + ' union'
end
set @SqlQry = @SqlQry + @ResolvedQry
set @dec = @dec + 1
END
set @SqlQry ='select * from ( ' + @SqlQry + ') as dt order by [Date] desc'
print @SqlQry
exec(@SqlQry)
结果:
Date RWQ22003DTDDS
------------------- ----------------------
Aug 21 2009 5:00AM 3586
Aug 20 2009 5:00AM 7233
Aug 19 2009 5:00AM 9099
Aug 18 2009 5:00AM 9099
Aug 17 2009 5:00AM 8909
Aug 16 2009 5:00AM 8516
Aug 15 2009 5:00AM 8064
Aug 14 2009 5:00AM 7437
评论
答案 0 :(得分:3)
试试这个(假设多行是好的,如果YourValue不是PK):
SELECT
YourTable.*
FROM YourTable
INNER JOIN (SELECT
MAX(YourValue) AS YourValue
FROM YourTable
WHERE YourDate>=_StartDateTime
AND YourDate<=_EndDateTime_
) dt ON YourTable.YourValue=dt.YourValue
答案 1 :(得分:1)
我用这种方式解决了这种问题:
CREATE TEMPORARY TABLE Timespan (
Start DATETIME,
End DATETIME
);
INSERT INTO Timespan VALUES
('2009-08-21 05:00:00', '2009-08-22 05:00:00'),
('2009-08-20 05:00:00', '2009-08-21 05:00:00'),
('2009-08-19 05:00:00', '2009-08-20 05:00:00'),
('2009-08-18 05:00:00', '2009-08-19 05:00:00'),
('2009-08-17 05:00:00', '2009-08-18 05:00:00'),
('2009-08-16 05:00:00', '2009-08-17 05:00:00'),
('2009-08-15 05:00:00', '2009-08-16 05:00:00');
Select h1.Value as RWQ22003DTDDS, h1.Datetime
FROM Timespan t JOIN History h1 ON
(h1.Datetime BETWEEN t.Start AND t.End AND h1.Tagname = 'RWQ22003DTDDS')
LEFT JOIN History h2 ON
(h2.Datetime BETWEEN t.Start AND t.End AND h2.Tagname = 'RWQ22003DTDDS')
AND (h1.Value < h2.Value OR (h1.Value = h2.Value AND h1.Id < h2.Id))
WHERE h2.Value IS NULL;
答案 2 :(得分:0)
这是我认为你想要的SQL Server解决方案。要适应另一种SQL方言应该不难。
注意:由于LEFT加入,将会有没有历史记录的天数;我已经改变了&lt; = to&lt;因此,“日期时间”恰好在凌晨5点开始的行只会在一天内计算。
create table Seven(
daysBack int primary key
);
insert into Seven values
(0),(1),(2),(3),(4),(5),(6);
declare @today date = cast(current_timestamp as date);
select
dateadd(day,-daysBack,@today) as QueryDateFrom,
Max(Value) as RWQ22003DTDDS
from Seven left outer join History
on "Datetime" >= dateadd(day,-daysBack,@today)
and "Datetime" < dateadd(day,1-daysBack,@today)
group by dateadd(day,-daysBack,@today)
答案 3 :(得分:0)
SELECT CONVERT(CHAR(10),[datetime],110),MAX([value])
.....
GROUP BY CONVERT(CHAR(10),[datetime],110)