2017-11-30 3 views
0

Ich habe eine SQL-Abfrage, die so aussieht.MS SQL Wert ändern

Select Timestamp, Value From [dbo].[nro_ReadRawDataByTimeFunction](
    'SV/SVTP01.BONF0335-D1-W1-BL1', 
    '2017-11-01 00:00', 
    '2017-12-01 00:00') 
GO 

Dies wird

Timestamp  | Value 
1 2017-11-01 10:00 | 0 
2 2017-11-01 11:00 | 0 
3 2017-11-01 12:00 | 0 
4 2017-11-01 13:00 | 1 
5 2017-11-01 14:00 | 1 
6 2017-11-01 15:00 | 0 
7 2017-11-01 16:00 | 0 
8 2017-11-01 17:00 | 0 
9 2017-11-01 18:00 | 1 
10 2017-11-01 19:00 | 0 

Die vollständige Liste zurückzukehren viel größer ist, und ich bin 1,4,6 in in den Ergebnissen, wo Wertänderung von den letzten Ergebnis, so dass in diesem Fall Zeile nur interessiert , 9,10

ich weiß, wie es zu tun, wenn es direkt aus einer Tabelle ist, aber nicht, wenn es aus einer Funktion

+0

Warum machst du es nicht innerhalb der Funktion? – Squirrel

+0

Kann es nicht ändern, da es mein multiples System verwendet, das –

+0

@ T.Nesset würde Sie nichts nützliches finden? Bitte akzeptieren Sie die Lösung – Simone

Antwort

0

Was ich mit beendet wird wie folgt

@DECLARE @startDate DATE, 
@tagName nVarChar(200); 

WITH CTE AS( 
     SELECT Timestamp As StopTime, Value As [OFF], LAG(Value,1) OVER (order by Timestamp) As [ON], Quality 
     FROM [dbo].[nrp_ReadRawDataByTimeFunction] (@TagName,@startDate, DATEADD(MONTH,2,@startDate)) 
     Where Quality & 127 = 100 
), 
CalenderCTE AS(
     SELECT [DATE] = DATEADD(Day,Number,@startDate) 
     FROM master..spt_values 
     WHERE Type='P' 
     AND DATEADD(day,Number,@startDate) < DATEADD(MONTH,1,@startDate) 
) 

SELECT * FROM CTE 
FULL OUTER JOIN 
CalenderCTE on CalenderCTE.Date = CAST(CTE.StopTime as [Date]) 
Where CTE.[OFF] != CTE.[ON} 

Dies ist nur ein kleiner Teil der Abfrage, da es viel mehr tut, was nicht im ursprünglichen Beitrag enthalten ist.

Vielen Dank für Ihre Eingaben, es hilft mir auf dem Weg zum Endergebnis.

0

ist ist diese Funktion eine Tabellenwertfunktion ist, können Sie es nur in dem where setzen oder Mach es in einem Funktion, in diesem zweiten Fall als Parameter?

Select a.Timestamp, a.Value From [dbo].[nro_ReadRawDataByTimeFunction](
    'SV/SVTP01.BONF0335-D1-W1-BL1', 
    '2017-11-01 00:00', 
    '2017-12-01 00:00') as a 
WHERE a.Value = 1 
+0

Es ist eine Table-Valued-Funktion ja, aber wenn ich versuche, es zu bearbeiten, bricht es andere System, das dies verwendet. Beachten Sie, dass dies keine von uns erstellte Funktion ist, sondern ein Berichtsservice. –

1

können Sie diese Konstruktion verwenden:

;WITH cte AS (
    Select [Timestamp], 
      [Value] 
    From [dbo].[nro_ReadRawDataByTimeFunction](
     'SV/SVTP01.BONF0335-D1-W1-BL1', 
     '2017-11-01 00:00', 
     '2017-12-01 00:00') 
) 

SELECT TOP 1 WITH TIES c.* 
FROM cte c 
OUTER APPLY (
    SELECT TOP 1 * 
    FROM cte 
    WHERE [Value] != c.[Value] AND c.[Timestamp] < [Timestamp] 
    ORDER BY [Timestamp] ASC 
) t 
ORDER BY ROW_NUMBER() OVER (PARTITION BY t.[Timestamp] ORDER BY c.[Timestamp] ASC) 

Ausgang:

Timestamp   Value 
2017-11-01 19:00 0 
2017-11-01 10:00 0 
2017-11-01 13:00 1 
2017-11-01 15:00 0 
2017-11-01 18:00 1 

Erläuterung:

SELECT * 
FROM cte c 
OUTER APPLY (
    SELECT TOP 1 * 
    FROM cte 
    WHERE [Value] != c.[Value] AND c.[Timestamp] < [Timestamp] 
    ORDER BY [Timestamp] ASC 
) t 

Hier wählen wir Daten aus Haupttabelle und mit Hilfe von OUTER APPLY fügen Sie jeder Zeile Daten mit unterschiedlichem Wert und größerem Zeitstempel hinzu.

ROW_NUMBER() OVER (PARTITION BY t.[Timestamp] ORDER BY c.[Timestamp] ASC) 

Hope, sind Sie vertraut mit ROW_NUMBER es

kehrt die laufende Nummer einer Zeile innerhalb einer Partition einer Ergebnismenge in jeder Partition auf 1 für die erste Startreihe.

Also, wenn Sie die obige Abfrage und fügen Sie diesen Code auf SELECT ausführen, erhalten Sie:

Timestamp   Value Timestamp   Value rn 
2017-11-01 19:00 0  NULL    NULL 1 
2017-11-01 10:00 0  2017-11-01 13:00 1  1 
2017-11-01 11:00 0  2017-11-01 13:00 1  2 
2017-11-01 12:00 0  2017-11-01 13:00 1  3 
2017-11-01 13:00 1  2017-11-01 15:00 0  1 
2017-11-01 14:00 1  2017-11-01 15:00 0  2 
2017-11-01 15:00 0  2017-11-01 18:00 1  1 
2017-11-01 16:00 0  2017-11-01 18:00 1  2 
2017-11-01 17:00 0  2017-11-01 18:00 1  3 
2017-11-01 18:00 1  2017-11-01 19:00 0  1 

Wie Sie sehen können, werden alle Zeilen, die Sie benötigen, sind mit 1 markiert. Wir haben das in andere CTE oder Unterabfrage eingefügt und verwenden rn = 1, aber wir können es all-in-one mit Hilfe von TOP 1 WITH TIES (MSDN link) tun.

+0

Ich werde das heute später versuchen, Danke für deine Antwort. Will dich wissen lassen, wie es funktioniert –

1

Da Sie auf SQL Server 2012 beziehen können Sie die neuen Funktionen nutzen:

;WITH Hist AS (
    SELECT r, 
    LAG(v) OVER(ORDER BY d) PreviousValue, 
    v, 
    LEAD(v) OVER(ORDER BY d) NextValue ---Just to know that also this is available 
    FROM #t 
) 
SELECT * 
FROM Hist h Inner JOIN #t t ON h.r = t.r 
WHERE ISNULL(h.PreviousValue, -1) != t.v 

#t enthält Ihre Ergebnisse