Jump to content

Interpolation mit SQL 2012


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hey Leute,
ich habe eine sehr komplizierte Frage. Ich habe auch leider sehr wenig Ahnung von Microsoft SQL Mangement Studio 2012, weshalb, wenn ihr eine Lösung habt, es mir bitte ausführlich erklären müsst (danke schon mal im Vorraus!)
Es geht um Winddaten (VAL) um ca. 4Millionen. Davon ist in einer Spalte der Zeitstempel (TIM) nach dem Muster:2014-06-05 06:00:14.000 (Datum Uhrzeit) angeben. In der anderen Spalte die Windgeschwindigkeit zu dem Zeitpunkt (von 0 bis max 15 m/s oder höher). ich möchte Zwei Dinge jetzt tun:

  • Zuerst möchte ich das es alle doppelten oder sogar dreifachen Minuten Werte zusammen gefasst werden. Sprich das ich Minuten Werte habe und nicht Sekunden Werte. Für die Messwerte bedeutet dies, dass die Werte gemittelt werden müssen.
  • Im nächsten Schritt möchte ich wenn nun für ein Minutenblock kein Messwert existiert, dass hier Interpoliert (zwischen dem vorherigen Wert und dem nächsten Wert) wird.

Ist das mit SQL möglich? Und wenn ja wie sieht die Lösung aus?

Gruß Archimos

 

 

post-69702-0-20708200-1415348761_thumb.jpg

Link zu diesem Kommentar

Hi
 
Hab dir mal die Funktion gebastelt. Diese funktioniert allerdings mit der "echten" linearen Interpolation nach Newton, d.h. sie funktioniert auch mit größeren Lücken in deiner Zeitskala.

 

1. Du ersetzt in der Funktion den Text "WindTable" mit dem Namen DEINER Tabelle. Den Namen der Funktion selbst kannst so lassen oder auch nicht.

2. Ausführen. Damit hast du eine Funktion, die dir eine Tabelle zurück liefert.

3. Anwendung: SELECT * FROM get_WindTable()

 

Dann hast du, was du willst

CREATE FUNCTION [dbo].[get_WindTable]() 
RETURNS 
@RawTable TABLE 
(
       TIM datetime,
       VAL decimal(8,3)    
)
AS
BEGIN
       
       DECLARE @BaseTIM datetime
       DECLARE @NextTIM datetime
       DECLARE @BaseVAL decimal(8,3)
       DECLARE @NextVAL decimal(8,3)
       
	   DECLARE @DiffCounter int

       DECLARE WindCursor CURSOR
       FOR
             SELECT
                    Base.TIM,Base.VAL,
                    LEAD(Base.TIM,1,0) OVER (ORDER BY Base.TIM) NextTIM,
                    LEAD(Base.VAL,1,0) OVER (ORDER BY Base.TIM) NextVAL
             FROM
             (SELECT TOP 100 PERCENT
                    CONVERT(datetime,CONVERT(char(16),TIM,121)) TIM,
                    CONVERT(decimal(8,3),AVG(VAL)) VAL
             FROM 
                    WindTable
             GROUP BY
                    CONVERT(datetime,CONVERT(char(16),TIM,121))
             ORDER BY
                    CONVERT(datetime,CONVERT(char(16),TIM,121))) Base

       OPEN WindCursor

       FETCH NEXT FROM WindCursor INTO @BaseTIM,@BaseVAL,@NextTIM,@NextVAL

       WHILE @@FETCH_STATUS=0
       BEGIN
             INSERT INTO @RawTable (TIM,VAL) VALUES (@BaseTIM, @BaseVAL)

			 SET @DiffCounter = 1

			 WHILE @DiffCounter < DATEDIFF(minute,@BaseTIM,@NextTIM)
			 BEGIN
				
				INSERT INTO @RawTable 
					(
						TIM,
						VAL
					) 
				VALUES 
					(
						DATEADD(minute,@DiffCounter,@BaseTIM),
						@BaseVAL+(@NextVAL-@BaseVAL)*@DiffCounter/DATEDIFF(minute,@BaseTIM,@NextTIM)
					)

				SET @DiffCounter = @DiffCounter + 1
			 END
			                          
             FETCH NEXT FROM WindCursor INTO @BaseTIM,@BaseVAL,@NextTIM,@NextVAL
       END
             
       CLOSE WindCursor
       DEALLOCATE WindCursor
       
       RETURN 
END
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...