Das passt ja fast zur Fussball-Weltmeisterschaft. Ein Teilnehmer einer ppedv Schulung schreibt mir:
“Ich habe da eine „knifflige“ Aufgabe in der Firma, wo ich mit meinem bescheidenen SQL-Wissen nach ein paar Stunden nicht mehr weiter komme. Ich kann's natürlich über Umwege lösen, glaube aber dass man das mit einem sql query oder sql query + stored procedure oder function auch zusammenbringt.”
Kurz zusammengefasst: eine SQL Abfrage im Microsoft SQL Server soll den zweiten Wert liefern. Die Frage war mir neu und mein SQL-Wissen auch ein wenig eingerostet - teilweise war es auf dem Stand von SQL 2000. Seit 2005 ist aber RowNum hinzugekommen und seit 2012 auch ein Offset-Kommando, um in Kombination mit z.B. TOP /Group By einfach einen Datensatz zu überspringen. So zunächst mein erster Gedanke.
Die Ausgangstabelle
1: CREATE TABLE [dbo].[KickiTest](
2: [ID] [int] IDENTITY(1,1) NOT NULL,
3: [Ergebnis] [bit] NULL,
4: [Datum] [datetime] NULL,
5: [Seriennummer] [int] NULL
6: ) ON [PRIMARY]
Die Daten

Abfrage: Für alle Geräte, deren Ergebnis positiv ist, der zweite Datensatz. Wenn dieser nicht vorhanden ist, wird der erste abgefragt.
Die Lösung verwendet die generierte Zeilennummer in Kombination mit einem Zähler
1: WITH tmp AS (SELECT ID, Ergebnis, Datum, Seriennummer,
2: anzahl= Count(seriennummer) OVER(PARTITION BY seriennummer) ,
3: ROW_NUMBER() OVER (PARTITION BY seriennummer
ORDER BY seriennummer,datum) AS RowNum
4: FROM KickiTest where ergebnis=1)
5:
6:
7: SELECT ID, Ergebnis, Datum, Seriennummer,rownum,anzahl
8: from tmp
9: where (anzahl = 1) or (anzahl>1 and rownum=2)