Archimos 0 Geschrieben 7. November 2014 Melden Teilen Geschrieben 7. November 2014 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 Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 7. November 2014 Melden Teilen Geschrieben 7. November 2014 Nur zur Info für andere Mitleser. In den MSDN-Foren hat der TO ebenfalls einen Thread eröffnet: http://social.Msdn.microsoft.com/Forums/de-DE/sqlserverde/thread/f7becc5f-bd4f-4aa1-9a58-2c1c79e38bd7#f7becc5f-bd4f-4aa1-9a58-2c1c79e38bd7 Zitieren Link zu diesem Kommentar
Pathomorph 1 Geschrieben 10. November 2014 Melden Teilen Geschrieben 10. November 2014 Hi Archimos Wie groß können die Minuten-Lücken sein? Wenn du in einem "Minutenblock" keine Messwerte hast... Hast du wenigstens im nächsten Minutenblock mind. ein Messwert? Oder können die Lücken größer sein? Gruß Zitieren Link zu diesem Kommentar
Pathomorph 1 Geschrieben 11. November 2014 Melden Teilen Geschrieben 11. November 2014 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 Zitieren Link zu diesem Kommentar
ukulele 11 Geschrieben 12. November 2014 Melden Teilen Geschrieben 12. November 2014 Hier steht übrigens auch meine Lösung: http://www.datenbankforum.com/threads/interpolation-mit-sql.2116/ Zitieren Link zu diesem Kommentar
Pathomorph 1 Geschrieben 12. November 2014 Melden Teilen Geschrieben 12. November 2014 Hi Ukulele Deine Lösung interpoliert nicht.. ;-) Zitieren Link zu diesem Kommentar
ukulele 11 Geschrieben 12. November 2014 Melden Teilen Geschrieben 12. November 2014 Deine Lösung interpoliert nicht.. ;-)Nebensache :-) Sie liefert jedenfalls per CTE eine Datenbasis auf der man mit ein bis zwei Joins interpolieren kann ohne dazu einen Cursor zu verwenden. Leider ließ sich das bei Archimos nach seiner Aussage nicht ausführen, was ich nicht nachvollziehen kann. Er sagt ja auch nichts mehr :( Zitieren Link zu diesem Kommentar
Pathomorph 1 Geschrieben 12. November 2014 Melden Teilen Geschrieben 12. November 2014 Ohne Cursor hätte ich keine Idee, wie man fehlende Messwerte in die vorhanden Datenmenge interpolatorisch integrieren kann. Es müssen neue Datensätze "generiert" werden... Archimos tantz auch auf andere Hochzeiten... http://www.ms-office-forum.net/forum/showthread.php?p=1625529 Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 12. November 2014 Melden Teilen Geschrieben 12. November 2014 Archimos tantz auch auf andere Hochzeiten... http://www.ms-office-forum.net/forum/showthread.php?p=1625529 Ich hatte ja auch schon einen Link in die MSDN-Foren gepostet. Gar nicht nett so ein Cross Posting. :( Zitieren Link zu diesem Kommentar
Pathomorph 1 Geschrieben 12. November 2014 Melden Teilen Geschrieben 12. November 2014 Jou... Er beschäftigt alle und dann meldet er sich nicht mal... Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.