2009-08-21 73 views
0

我試圖從第二天早上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天以前做這個

UPDATE:

這裏是我想出了

 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()[email protected])as nvarchar) +'/'+ 
      cast(datepart(dd,getdate()[email protected])as nvarchar) +'/'+ 
      cast(datepart(yyyy,getdate()[email protected]) as nvarchar)+' 06:00:00' 


set @ResolvedQry = ' Select cast( convert(datetime,'''[email protected]+''',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 [email protected] + ' 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

這個問題沒有足夠的細節。所涉及的表的模式以及一些相同的數據和預期的輸出是完全回答問題所需要的。 – Welbog 2009-08-21 15:37:54

+0

你真的需要在這裏詳細說明。你到底有什麼問題? – Jimmeh 2009-08-21 15:37:56

+0

您正在使用的數據庫的模式是什麼? – BobBrez 2009-08-21 15:39:44

回答

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 
+0

很難從OP問題中知道他們在尋找什麼。這是一個通用查詢,它會在日期/時間範圍內查找MAX值,然後返回並返回該行的所有列。重複是可能的,這取決於YourValue的唯一性,因此如果需要的話,您可能希望將派生表的WHERE複製到主查詢中(如果有幫助的話) – 2009-08-21 15:51:54

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; 
0

下面是一個SQL服務器解決方案,我想你想要的。要適應另一種SQL語言不應該很難。

注意:由於LEFT加入,會有一個沒有歷史的日子的結果;我已將< =更改爲<,以便「日期時間」恰好在上午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) 
0

SELECT CONVERT(CHAR(10),[日期時間],110),MAX([值])

.....

GROUP BY CONVERT(CHAR(10), [datetime],110)

相關問題