Announcement

Collapse
No announcement yet.

Zeilenweise Berechnungen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeilenweise Berechnungen

    Hallo zusammen,

    ich sitze hier schon seit Tagen an einem Problem und hoffe es kann mir jemand helfen.

    Folgendes:
    Ich habe eine Datenbank in der die Messwerte verschiedener Sensoren (ca. 30Stück) liegen. Jeder Messwert hat eine Sensor_ID und einen Zeitstempel aufgrund derer die Zeilen eindeutig sind.

    Nun müssen die Messwerte der 'nebeneinander liegenden' Sensoren voneinander abgezogen werden. Also immer zwischen zwei Zeilen.

    Für Zwei Messwerte habe ich es folgendermaßen gelöst:
    [highlight=sql]
    Update SensorMW
    SET deltaU = 0.5 *
    (
    Select sum
    (
    case
    when Datum = '2007-01-01 03:00:00.000' and Sensor_ID = '1' then deltaDC1
    when Datum = '2007-01-01 03:00:00.000' and Sensor_ID = '8' then -deltaDC1
    else 0 end
    )
    from SensorMW
    )

    where Datum = '2007-01-01 03:00:00.000' and Sensor_ID = '1';

    Update SensorMW
    SET deltaU = 0.5 *
    (
    Select sum
    (
    case
    when Datum = '2007-01-01 03:00:00.000' and Sensor_ID = '8' then deltaDC1
    when Datum = '2007-01-01 03:00:00.000' and Sensor_ID = '9' then -deltaDC1
    else 0 end
    )
    from SensorMW
    )

    where Datum = '2007-01-01 03:00:00.000' and Sensor_ID = '9';
    [/highlight]

    Da es sich aber um mehrere Messungen am Tag und mehrere Sensoren handelt, würde ich das gerne dynamisch lösen.

    Hat jemand eine Idee oder Vorschläge, wie es anders gehen könnte?

    Vielen Dank für eure Hilfe!
    Attached Files
    Zuletzt editiert von taw1; 19.05.2011, 12:08.

  • #2
    Schau die mal dir Funktionen LAG und LEAD an, damit müsste sich dein Problem lösen lassen.

    Gruss

    Comment


    • #3
      Originally posted by Wernfried View Post
      Schau die mal dir Funktionen LAG und LEAD an, damit müsste sich dein Problem lösen lassen.

      Gruss
      da nach dem Screenshot zu urteilen das RDBMS ein SQL-Server ist, wird das nix nutzen, da SQL-Server die genannten Window-Funktionen nicht implementiert

      Comment


      • #4
        Erstmal DANKE für eure Antworten.

        Hatte vergessen zu erwähnen, dass es sich um den Sql-Server handelt. Somit fallen die Varianten LAG und LEAD flach. Bin bei meiner Suche auch schön öfter darüber gestolpert.

        Ich habe auch schon versucht, die Tabelle zu transformieren (Kreuztabelle). Die Query funktioniert soweit - allerdings ist bei 27 Sensoren schluss! Wenn ich 28 Sensoren auswähle bekomme ich eine Fehlermeldung.
        Außerdem bringt mir die Transformation wieder eine neue Tabelle - was ich gerne vermeiden möchte.

        Hoffe auf weitere Vorschläge...

        Comment


        • #5
          ... wenn man Funktionen braucht, kann man sich die leicht selber schreiben. Der SQL-Server hat da zB. die UserDefinedFunctions oder für "wildere Sachen" die CLR-Integration, damit könnte man sogar mit C# oder ähnlichem arbeiten.

          bye,
          Helmut

          Comment


          • #6
            Ich habe mir schon gedacht, dass ich um eine Funktion bzw. Prozedur hierfür nicht herum komme.

            Ich bin inzwischen auch schon ein wenig weiter gekommen. Ich habe die Zeilen nun per Row_number() und INNER JOIN verschoben:

            [highlight=sql]UPDATE SensorMW SET deltaU = deltaDC1_a-deltaDC1_b
            FROM
            (
            (
            SELECT deltaDC1 AS deltaDC1_a,
            Sensor_ID AS Sensor_ID_a,
            row_number() over
            (
            order by Datum,
            Sensor_ID asc
            ) as rn_a
            FROM SensorMW WHERE Datum = '2007-01-01 03:00:00.000'
            ) a
            inner join
            (
            SELECT deltaDC1 AS deltaDC1_b,
            row_number() over
            (
            order by Datum,
            Sensor_ID asc
            ) as rn_b
            FROM SensorMW WHERE Datum = '2007-01-01 03:00:00.000'
            ) b
            on b.rn_b -1 = a.rn_a
            )
            WHERE Sensor_ID = Sensor_ID_a AND Datum = '2007-01-01 03:00:00.000'))[/highlight]

            Um das Ganze dann zu automatisieren, wähle ich das Datum per SELECT DISTINCT aus und lasse die Query für jedes Datum laufen.

            [highlight=sql]Declare @SQL_Anfang nvarchar(50)
            Declare @Datumliste nvarchar(max)
            Declare @SQL_Ende nvarchar(50)


            SET @SQL_Anfang = ''
            SELECT @SQL_Anfang = 'Begin
            '
            SET @Datumliste = ''
            Select @Datumliste = @Datumliste + '


            UPDATE SensorMW SET deltaU = deltaDC1_a-deltaDC1_b
            FROM
            (
            (
            SELECT deltaDC1 AS deltaDC1_a,
            Sensor_ID AS Sensor_ID_a,
            row_number() over
            (
            order by Datum,
            Sensor_ID asc
            ) as rn_a
            FROM SensorMW WHERE Datum = '''+ Datum + '''
            ) a
            inner join
            (
            SELECT deltaDC1 AS deltaDC1_b,
            row_number() over
            (
            order by Datum,
            Sensor_ID asc
            ) as rn_b
            FROM SensorMW WHERE Datum = '''+ Datum + '''
            ) b
            on b.rn_b -1 = a.rn_a
            )
            WHERE Sensor_ID = Sensor_ID_a AND Datum = '''+ Datum + '''; '
            FROM
            (
            Select Distinct TOP(100) Convert
            (
            nvarchar(50), Datum, 121
            )
            Datum from SensorMW WHERE deltaU is null
            ) D


            SET @SQL_Ende = ''
            SELECT @SQL_Ende = '
            End'

            EXEC (@SQL_Anfang + @Datumliste + @SQL_Ende)
            --Print (@SQL_Anfang + @Datumliste + @SQL_Ende) [/highlight]

            Allerdings bin ich mir nicht sicher, ob man das nicht auch einfacher - schneller - performanter lösen kann.

            Bin wie immer für jeden Vorschlag dankbar!
            Zuletzt editiert von taw1; 22.05.2011, 14:41.

            Comment

            Working...
            X