2009-08-21 2 views
0

Ich versuche am nächsten Morgen einen Maximalwert von 5 bis 5 Uhr anzufragen. Ich möchte auch den Beginn des Abfragedatums in den Ergebnissen haben.Wie frage ich nach einem maximalen Wert und gebe das zurückgefundene Datum zurück

hier ist das, was ich

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' 

Ich mag würde das Datum „2009-08-21“ in den Ergebnissen sein, so weit haben.

datetime, value 
------------------ 
2008-08-21, 2216  
2008-08-20, 4312 

usw. und dies für 7 Tage tun vorherigen

UPDATE:

hier ist eine andere approch ich mit

 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) 

Ergebnisse kam:

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 

Kommentare?

+0

Es gibt nicht genug Details in dieser Frage. Ein Schema der beteiligten Tabelle (n) und einige gleiche Daten und erwartete Ausgabe wird benötigt, um die Frage vollständig zu beantworten. – Welbog

+0

Sie müssen wirklich hier erarbeiten. Mit was genau hast du Probleme? – Jimmeh

+0

Was ist das Schema für die Datenbank, die Sie verwenden? – BobBrez

Antwort

3

versuchen, diese (geht davon aus, dass mehrere Zeilen sind in Ordnung, wenn die YourValue ist kein 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

Es ist schwer von der OP-Frage zu unterscheiden, wonach sie suchen. Dies ist eine generische Abfrage, die den MAX-Wert innerhalb eines Datums-/Uhrzeitbereichs findet und dann alle Spalten für diese Zeile zurückgibt und zurückgibt. Duplikate sind eine Möglichkeit, abhängig von der Eindeutigkeit von YourValue. Daher sollten Sie das WHERE der abgeleiteten Tabelle gegebenenfalls auf die Hauptabfrage replizieren (falls es hilft). –

1

ich diese Art der Abfrage auf diese Weise lösen:

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

hier ein SQL ist Server-Lösung für was ich denke, dass Sie wollen. Es sollte nicht schwer sein, sich an einen anderen SQL-Dialekt anzupassen.

Anmerkungen: Wegen der LINKEN Verknüpfung wird es ein Ergebnis für Tage ohne Historie geben; Ich habe < = zu < geändert, so dass Zeilen, in denen "Datetime" genau um 5:00 Uhr fällt, nur an einem Tag gezählt werden.

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), [DATETIME], 110), MAX ([Wert])

.....

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

Verwandte Themen