etnobommel1989
Goto Top

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

Content-Key: 160488

Url: https://administrator.de/contentid/160488

Printed on: April 19, 2024 at 15:04 o'clock

Member: nxclass
nxclass Feb 09, 2011 at 22:33:43 (UTC)
Goto Top
Da wirst Du wohl eine PROCEDURE erstellen müssen und mit einem CURSOR arbeiten.

Benutzt Du MySQL ? - ich hab morgen etwas Zeit, dann versuch ich das mal zu lösen.
Member: nxclass
nxclass Feb 10, 2011 at 07:54:19 (UTC)
Goto Top
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`;
Member: G.Wallenstein
G.Wallenstein Feb 10, 2011 at 20:36:14 (UTC)
Goto Top
Hallo,

das geht sicher mit einer einfachen Abfrage.

SELECT MAX(Anzahl)FROM
(SELECT COUNT(W) AS Anzahl FROM TW GROUP BY W) AS MaxAnzahl

W ist Das Feld
TW die Tabelle

Grüße
Günter
Member: nxclass
nxclass Feb 10, 2011 at 21:47:55 (UTC)
Goto Top
SELECT MAX(Anzahl)FROM
(SELECT COUNT(W) AS Anzahl FROM TW GROUP BY W) AS MaxAnzahl
... hast Du das mal getestet mit den Daten von oben ?
Member: G.Wallenstein
G.Wallenstein Feb 10, 2011 at 21:54:34 (UTC)
Goto Top
Nee, aber mit einer anderen Tabelle.
Vorausgesetzt die Daten stehen pro Wurfergebnis in einem Satz der Tabelle.
Also
SPALTE W
z
z
z
z
z
k
k
k
Sonst bräuchte man ja keine Tabelle, ein Textfile würde es auch tun..

LG
Member: nxclass
nxclass Feb 11, 2011 at 08:06:55 (UTC)
Goto Top
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 Problem

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 ... face-smile)))
Member: etnobommel1989
etnobommel1989 Feb 12, 2011 at 09:13:57 (UTC)
Goto Top
Vielen Dank für eure zahlreichen Antworten,

ich werds jetzt gleich mal ausprobieren, konnte nur bis jetzt noch nicht, weil ich vorgestern operiert werden musste.

Vielen Dank
Member: etnobommel1989
etnobommel1989 Feb 12, 2011 at 09:41:18 (UTC)
Goto Top
Achso Leute ich hab das jetzt mal probiert,

ich hab die ganzen Daten im Access und wenns geht wäre es nett wenn ihr den Quelltext Access tauglich formuliert, weil da kommt immer die Fehlermeldung "Unzulässige SQL Anweisung: INSERT, CREATE, SELECT oder UPDATE erwartet"
Member: nxclass
nxclass Feb 12, 2011 at 13:55:16 (UTC)
Goto Top
den Quelltext Access tauglich formuliert
... soweit mir bekannt ist, kann Access dies nur in Verbindung mit VBA - da kann ich Dir leider nicht weiter helfen.

(ggf. ein neues Thema unter Windows-Office-Access mitit einem Verweis erstellen)
Member: etnobommel1989
etnobommel1989 Feb 12, 2011 at 13:57:58 (UTC)
Goto Top
Achso na gut dann weiß ich wenigstens Bescheid, da werd ich mal ne Weboberfläche gestalten und diese mit ner mysql Datenbank connecten
Member: Biber
Biber Feb 12, 2011 at 15:51:54 (UTC)
Goto Top
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.
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'  
)
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
Member: etnobommel1989
etnobommel1989 Feb 13, 2011 at 12:48:07 (UTC)
Goto Top
Vielen , vielen Dank du bist mein persönliche werd Held, ich werd in Zukunft genauer überlegen was ich wo rein schreibe, ich probiers gleich mal aus
Member: etnobommel1989
etnobommel1989 Feb 13, 2011 at 13:38:49 (UTC)
Goto Top
Irgendwie geht gar nix, also es rührt sich nix, weder Fehlermeldung noch sontiges??
Member: Biber
Biber Feb 13, 2011 at 15:39:33 (UTC)
Goto Top
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
  • "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
Member: Biber
Biber Feb 19, 2011 at 12:11:18 (UTC)
Goto Top
Moin etnobommel1989,

kann ein Haken an den Beitrag, kommen noch Fragen, kann es kompostiert werden?

Bitte um Feedback hier im Forum - hier hast du doch auch welches bekommen...

Grüße
Biber
Member: rakodani
rakodani Jun 09, 2012 at 15:34:45 (UTC)
Goto Top
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