Как запросить максимальное значение и найденную дату возвращения - PullRequest
0 голосов
/ 21 августа 2009

Я пытаюсь запросить максимальное значение с 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

Комментарии

Ответы [ 4 ]

3 голосов
/ 21 августа 2009

попробуйте это (предполагается, что несколько строк в порядке, если 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 голос
/ 21 августа 2009

Я решаю этот запрос следующим образом:

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 голосов
/ 21 августа 2009

ВЫБРАТЬ КОНВЕРТ (CHAR (10), [datetime], 110), MAX ([значение])

.....

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

0 голосов
/ 21 августа 2009

Вот решение SQL Server для того, что я думаю, вы хотите. Не должно быть трудно приспособиться к другому диалекту SQL.

Примечания: из-за ЛЕВОГО соединения результат будет для дней без истории; Я изменил <= на <, чтобы строки, в которых «Дата / время» приходилось ровно в 5:00 утра, учитывались только через один день. </p>

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...