Freunde,So wählen Sie Datensätze aus SQL Server
Ich habe ein SQL-Problem, das ich Hilfe verwenden könnte. Ich arbeite mit SQL Server 2008.
Der Anwendungsfall ist der folgende. Wir haben ein System, in dem Nutzer Videos ansehen und jedes Mal, wenn ein Nutzer ein Video ansieht, erfassen wir diese Aktivität. Wir erfassen jedes Mal drei Eigenschaften. AssetID (ein Asset ist ein Video), customerid und Status.
Ein Datensatz kann drei verschiedene Status haben; "Vervollständigen", "Spielen" und "Starten".
Die Person, die diesen Teil des Systems geschrieben hat, ist kein Entwickler. Statt den Status eines vorhandenen Datensatzes zu aktualisieren, wird bei jeder Wiedergabe eines Videos ein neuer Duplikateintrag eingefügt. Daher haben wir Tausende von doppelten Datensätzen. Hier ist ein Beispieldatensatz
Das Problem, das ich lösen müssen, ist, einen Datensatz zu wählen, indem AssetID, customerid und Status. Ich muss einen Datensatz auswählen, der den Status "Fertigstellung" hat, wenn er existiert.
Wenn ein Datensatz den Status "Abspielen" hat, aber kein Datensatz mit derselben Assetid und customerid mit dem Status "Completion" vorhanden ist, wählen Sie diesen Datensatz aus.
Wenn ein Datensatz den Status 'start' hat, aber kein Datensatz mit derselben Assetid und customerid mit dem Status 'completion' oder 'playing' existiert, dann wählen Sie diesen Datensatz aus.
Hier ist Beispielcode, wo ich versucht habe, eine CASE-Anweisung zu verwenden, um das Problem zu lösen. Ich versuchte auch eine andere Fallanweisung mit einer NOT IN Unterabfrage, aber ohne Erfolg.
INSERT INTO #ViewTime (AssetID, CustomerID, ViewTime)
SELECT
tt.customerid, tt.assetId, tt.assetstatus,
CASE WHEN
tt.AssetStatus = 'COMPLETION'
AND
ISNUMERIC(timeposition) = 1
THEN
CONVERT(Numeric(18,3), timePosition)
WHEN
tt.AssetStatus = 'PLAYING'
AND
ISNUMERIC(timeposition) = 1
THEN
CONVERT(Numeric(18,3), timePosition)
WHEN
tt.AssetStatus = 'START'
AND
ISNUMERIC(timeposition) = 1
THEN
CONVERT(Numeric(18,3), timePosition)
ELSE null
END AS ViewTime
FROM
TableAssetTracking tt
inner join TableAssets ta
on tt.AssetID = ta.AssetID
WHERE
tt.timePosition is not null
AND
AssetBuffering is null
Alle Vorschläge würden sehr geschätzt werden. Danke, Derek
Anstatt ein Bild für Beispieldaten wie über einige ddl und Verbrauchsdaten? Auch eine Erklärung dessen, was Sie als Ausgabe erwarten, würde erheblich helfen. Sie könnten diesen Artikel in Betracht ziehen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
Auch diese Frage könnte besser für dba.stackexchange.com – John
geeignet sein @John Auf DBA würden sie nur diese Basis SQL betrachten und bleiben auf SE – Paparazzi