/ / SQL Server 2012 - Verwenden von LAG zum Abrufen von Daten aus früheren Zeilen - sql-server-2012, lag

SQL Server 2012 - Verwenden von LAG zum Abrufen von Daten aus früheren Zeilen - sql-server-2012, lag

Ich war in der Lage, LAG zu verwenden, um Daten von einer vorherigen Reihe zu erhalten, aber ich bemühe mich, es zu verwenden, um ein komplizierteres Problem zu lösen.

Im Wesentlichen für jede Episode in meiner Tabelle könnte es, sagen wir, 10 einzigartige Zuschauerzahlen geben. Jede Teilnahme hat einen Wert von 1, 2 oder 3.

Was ich erreichen muss, ist, wenn ein Anwesenheitswert erhöht wird, müssen alle folgenden Zeilen den gleichen Wert haben.

z.B.

Episode Attendance Value  New Value
12345      1        1        1
12345      2        1        1
12345      3        2        2
12345      4        1        2
12345      5        1        2
12345      6        2        2
12345      7        3        3
12345      8        1        3
12345      9        1        3
12345      10       1        3
34567      1        1        1
34567      2        2        2
34567      3        1        2
34567      4        2        2
34567      5        1        2
34567      6        3        3
34567      7        1        3
56789      1        2        2
56789      2        1        2
56789      3        1        2

Der neue Wert kann also von 1 auf 2 oder 3 und von 2 auf 3 steigen, sollte aber nicht abnehmen.

Jede Hilfe mit diesem würde sehr geschätzt werden. Die Verwendung von LAG ist vielleicht nicht die richtige Antwort, aber ich bin ein wenig Anfänger, wie Sie vielleicht gesammelt haben.

Hier ist das SQL, das ich bisher bekommen habe:

    SELECT *,


NewValue =
CASE    WHEN EPISODEID = Lag(EpisodeID,1) OVER(ORDER BY EpisodeID Asc) AND
LAG(Value, 1) OVER(ORDER BY [EpisodeID] asc, Attendance) >= Value THEN LAG(Value,1)
OVER(ORDER BY [EpisodeID] asc, Attendance)

ELSE        Value
END
FROM TABLE

Es funktioniert nur für eine Zeile und ich kann sehen, warum, aber ich habe nicht genug Anleitung gefunden, um es zu verbessern.

Frustrierend könnte ich das in Excel machen, aber ich versuche meine SQL-Kenntnisse zu verbessern

Antworten:

1 für die Antwort № 1

Diese Lösung verwendet ein CTE, um das Problem zu lösen. Der CTE überprüft, für welche Reihe der Zähler für jede Episodengruppe und Anwesenheitsereignis erhöht werden sollte. Er schließt sich dann Ihrem Tisch an und weist den Höchstwert zu, den das Teilnahmeereignis auf Ihrer Episode haben sollte.

    ;WITH CTE
AS (
SELECT episode
, value
, MIN(attendance) AS row_counter

FROM [your_table]

GROUP BY episode
, value
)

SELECT t.episode
, t.attendance
, t.value
, MAX(cte.value) AS new_Val

FROM [your_table] t

LEFT JOIN CTE
ON cte.episode = t.episode
AND t.attendance >= cte.row_counter

WHERE cte.episode = t.episode

GROUP BY t.episode
, t.attendance
, t.value

ORDER BY t.episode
, t.attendance