2009-08-21 10 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:

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 

ここで私は

 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) 

結果を思い付いた別のapprochです

コメント?

+0

この質問には詳細が不十分です。関係するテーブルのスキーマと、いくつかの同じデータと期待される出力が、質問に完全に答えるために必要です。 – Welbog

+0

あなたは本当にここで詳しく述べる必要があります。あなたは何に問題がありますか? – Jimmeh

+0

使用しているデータベースのスキーマは何ですか? – BobBrez

答えて

3

(YourValueがPKでない場合、複数の行は、OKであることを前提として)これを試してみてください。

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をメイン・クエリーにレプリケートすることができます(役立つ場合) –

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時になる行は1日にカウントされるだけです。

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 CONVERT(CHAR(10)、 [datetime]、110)

関連する問題