Aufeinanderfolgende gleiche Datensätze zählen
Ich habe eine Tabelle "Münzwurf", bestehend aus 2 Spalten.
1 Spalte : Durchgang (Autowert)
2 Spalte: Kopf_oder_Zahl
Hi Leute,
und zwar hab ich keine Ahnung wie ich da ran gehen soll. Ich suche eine SQL Anweisung mit der ich die größte Anzahl von gleich aufeinander folgenden Datensätze zähle.
z.B.
z,z,z,z,z,k,k,k,z,z,z,k,k,k,k,k,k,k,k,k,z,z,k,z,k,z,k,z
Wenn dies die Würfe nacheinander wären, würde ich gerne eine Abfrage haben, welche mir die Zahl 9 ausgibt, weil an der eine Stelle 9 mal nacheinander Kopf geworfen wurde.
Ich denke zwar schon das ich mich in SQL ein wenig auskenne, habe aber keinen richtigen Lösungsansatz.
Vielen Dank
1 Spalte : Durchgang (Autowert)
2 Spalte: Kopf_oder_Zahl
Hi Leute,
und zwar hab ich keine Ahnung wie ich da ran gehen soll. Ich suche eine SQL Anweisung mit der ich die größte Anzahl von gleich aufeinander folgenden Datensätze zähle.
z.B.
z,z,z,z,z,k,k,k,z,z,z,k,k,k,k,k,k,k,k,k,z,z,k,z,k,z,k,z
Wenn dies die Würfe nacheinander wären, würde ich gerne eine Abfrage haben, welche mir die Zahl 9 ausgibt, weil an der eine Stelle 9 mal nacheinander Kopf geworfen wurde.
Ich denke zwar schon das ich mich in SQL ein wenig auskenne, habe aber keinen richtigen Lösungsansatz.
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 160488
Url: https://administrator.de/contentid/160488
Ausgedruckt am: 25.11.2024 um 11:11 Uhr
16 Kommentare
Neuester Kommentar
meine Lösung: (für MySQL)
DELIMITER //
CREATE PROCEDURE `getMaxKopfOderZahl`(OUT maxKopf INT UNSIGNED, OUT maxZahl INT UNSIGNED)
BEGIN
DECLARE sCache VARCHAR(255) DEFAULT '';
DECLARE sKoZ CHAR(1);
DECLARE sKoZ_last CHAR(1) DEFAULT 'x';
DECLARE bDone INT DEFAULT 0;
DECLARE cCursor CURSOR FOR SELECT `kopf_oder_zahl` FROM `kopf_oder_zahl`;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET bDone = 1;
OPEN cCursor;
SET maxKopf = 0;
SET maxZahl = 0;
REPEAT
FETCH cCursor INTO sKoZ;
IF sKoZ_last <> sKoZ THEN
CASE sKoZ_last
WHEN 'k' THEN IF (CHAR_LENGTH(sCache) > maxKopf) THEN SET maxKopf = CHAR_LENGTH(sCache); END IF;
WHEN 'z' THEN IF (CHAR_LENGTH(sCache) > maxZahl) THEN SET maxZahl = CHAR_LENGTH(sCache); END IF;
ELSE BEGIN END;
END CASE;
SET sCache = '';
SET sKoZ_last = sKoZ;
END IF;
SET sCache = CONCAT(sCache, sKoZ);
UNTIL bDone END REPEAT;
CLOSE cCursor;
END //
DELIMITER ;
CALL getMaxKopfOderZahl(@k, @z);
SELECT @k AS `Kopf`, @z AS `Zahl`;
das ich mich in SQL ein wenig auskenne
z,z,z,z,z,k,k,k,z,z,z,k,k,k,k,k,k,k,k,k,z,z,k,z,k,z,k,z
... das war ja nicht das Problemz,z,z,z,z,k,k,k,z,z,z,k,k,k,k,k,k,k,k,k,z,z,k,z,k,z,k,z
ABER: ich hab mich auch nicht zufrieden gegeben und noch etwas experimentiert. Folgende Lösung gibt es noch:
SET @iCount = 0;
SET @sLast = 'x';
SELECT `kopf_oder_zahl`, COUNT(`KoZ_Group`) AS `Anzahl`
FROM (
SELECT
@sLast AS `sLast`,
@iCount:=IF(@sLast<>`kopf_oder_zahl`,@iCount+1,@iCount) AS `KoZ_Group`,
@sLast:=`kopf_oder_zahl` AS `kopf_oder_zahl`
FROM `kopf_oder_zahl`
) _tmp
GROUP BY `KoZ_Group`
ORDER BY `Anzahl` DESC
LIMIT 1;
Ihr könnt Gott zu mir sagen ... )))
Moin etnobommel1989,
das Problem bei deiner Anforderung ist nicht Access oder mySQL, VBA oder Stored Procedure,
sondern dass du keine Fragestellung hast, die irgendetwas mit Datenbank zu tun hat.
Einer Datenbanktabelle ist die (physikalische) Anordnung von Datensätzen vollkommen egal -
daher ist die Frage "wie oft kommen Sätze von Typ X hintereinander vor" vollkommen off topic.
Mit einem SELECT in Access ist natürlich lösbar, aber eben nur, wenn du es rein handwerklich-rechnerisch angehst.
Diese Abfrage bringt dir in zwei Zeilen die längste Immer-wieder-Kopf- bzw Immer-wieder-Zahl-Sequenz.
Hat aber mit SQL oder mit Datenbank nix zu tun - ist nur der Beweis "ich kann auch auch einen Dübel mit der Bohrmaschine in die Wand kloppen."
Grüße
Biber
das Problem bei deiner Anforderung ist nicht Access oder mySQL, VBA oder Stored Procedure,
sondern dass du keine Fragestellung hast, die irgendetwas mit Datenbank zu tun hat.
Einer Datenbanktabelle ist die (physikalische) Anordnung von Datensätzen vollkommen egal -
daher ist die Frage "wie oft kommen Sätze von Typ X hintereinander vor" vollkommen off topic.
Mit einem SELECT in Access ist natürlich lösbar, aber eben nur, wenn du es rein handwerklich-rechnerisch angehst.
Select 'k' as [Kopf/Zahl], Max(Iif(Isnull(bisZ), (select max(durchgang) from Münzwurf), bisZ) - dk+1) as MaxLängeSeq from (
SELECT Mk.Durchgang as Dk ,
(select min( Mz.Durchgang) from Münzwurf mz where Kopfzahl='z' and durchgang >=mk.durchgang) as bisZ
FROM Münzwurf mk where Kopfzahl ='k'
)
Union
Select 'z' , Max(Iif(Isnull(bisk),(select max(durchgang) from Münzwurf), bisk) - dz+1) as MaxLängeSeq from (
SELECT Mz.Durchgang as Dz ,
(select min( Mk.Durchgang) from Münzwurf mk where Kopfzahl='k' and durchgang >=mz.durchgang) as bisk
FROM Münzwurf mz where Kopfzahl ='z'
)
Hat aber mit SQL oder mit Datenbank nix zu tun - ist nur der Beweis "ich kann auch auch einen Dübel mit der Bohrmaschine in die Wand kloppen."
Grüße
Biber
Moin etnobommel1989,
hmm, "gar nix, weder Fehlermeldung noch sonstiges", das ist ungewöhnlich..
Bildschirm ist eingeschaltet?
Okay, ich habe in meiner SQL-Emulation ein bisschen geschlampt, was die Feldnamen angeht.
Die Tabelle, die ich durchflöhe heißt "Münzwurf" und hat zwei Felder
Bitte ersetze in meinem SQL alle Vorkommnisse von "Kopfzahl" durch "Kopf_oder_Zahl".
Grüße
Biber
hmm, "gar nix, weder Fehlermeldung noch sonstiges", das ist ungewöhnlich..
Bildschirm ist eingeschaltet?
Okay, ich habe in meiner SQL-Emulation ein bisschen geschlampt, was die Feldnamen angeht.
Die Tabelle, die ich durchflöhe heißt "Münzwurf" und hat zwei Felder
- "Durchgang" , Autowert
- "Kopfzahl" , Text, Inhalt 'k' für Kopf oder 'z' für Zahl ----> Bei dir heisst das Feld allerdings "Kopf_oder_Zahl".
Bitte ersetze in meinem SQL alle Vorkommnisse von "Kopfzahl" durch "Kopf_oder_Zahl".
Grüße
Biber
Hi,
ich habe jetzt versucht den Dübel mit der Bohrmaschine in die Wand zu kloppen. Aber ich habe ein Problem.
Ich habe es für meine Datenbank abgewandelt.
Ich möchte die Tabelle [Fifa 10] und das Feld [Daniel Tore] durchsuchen, wie oft hintereinander Daniel 3 Tore geschossen hat. Leider bekomme ich von Access immer folgende Fehlermeldung:
Die Unterabfrage in diesem Ausdruck hat eine fehlerhafte Syntax.
Prüfen Sie die Syntax der Unterabfrage, und setzen Sie die Unterabfrage in Klammern.
Mein Code sieht im Moment so aus:
= Select 3 as [Kopf/Zahl], Max(Iif(Isnull(bisZ), (select max(durchgang) from [Fifa 10]), bisZ) - dk+1) as MaxLängeSeq from (
SELECT Mk.Durchgang as Dk ,
(select min( Mz.Durchgang) from [Fifa 10] mz where [Daniel Tore]=5 and durchgang >=mk.durchgang) as bisZ
FROM [Fifa 10] where [Daniel Tore] =3
)
ich habe erstmal nur den ersten Teil realisieren wollen.
Ich bin aber sowieso mit diesem Code noch nicht am Ziel. Ich würde gerne Prüfen wie oft hintereinander das Feld [Daniel Tore] größer als das Feld [Tobias Tore] ist und umgekehrt. Also wer wie oft hintereinander gewonnen hat (Siegesserie). Ist dies auch über Access zu realisieren?
Viele Grüße und vielen Dank
Daniel
ich habe jetzt versucht den Dübel mit der Bohrmaschine in die Wand zu kloppen. Aber ich habe ein Problem.
Ich habe es für meine Datenbank abgewandelt.
Ich möchte die Tabelle [Fifa 10] und das Feld [Daniel Tore] durchsuchen, wie oft hintereinander Daniel 3 Tore geschossen hat. Leider bekomme ich von Access immer folgende Fehlermeldung:
Die Unterabfrage in diesem Ausdruck hat eine fehlerhafte Syntax.
Prüfen Sie die Syntax der Unterabfrage, und setzen Sie die Unterabfrage in Klammern.
Mein Code sieht im Moment so aus:
= Select 3 as [Kopf/Zahl], Max(Iif(Isnull(bisZ), (select max(durchgang) from [Fifa 10]), bisZ) - dk+1) as MaxLängeSeq from (
SELECT Mk.Durchgang as Dk ,
(select min( Mz.Durchgang) from [Fifa 10] mz where [Daniel Tore]=5 and durchgang >=mk.durchgang) as bisZ
FROM [Fifa 10] where [Daniel Tore] =3
)
ich habe erstmal nur den ersten Teil realisieren wollen.
Ich bin aber sowieso mit diesem Code noch nicht am Ziel. Ich würde gerne Prüfen wie oft hintereinander das Feld [Daniel Tore] größer als das Feld [Tobias Tore] ist und umgekehrt. Also wer wie oft hintereinander gewonnen hat (Siegesserie). Ist dies auch über Access zu realisieren?
Viele Grüße und vielen Dank
Daniel