Lücken und Inseln. Berechnen Sie die Länge jeder Insel. Endgültige Zählung ist die Länge der Insel dividiert durch 3 (ganzzahlige Division, Verwerfungsbruchteil).
Ich habe einige Zeilen (Teams A
und B
) 4 Siege von A
zu veranschaulichen, dann 7 Siege von B
, dann 4 Siege von A
wieder, die beide in Endzahl von 2 und 2 für A
und B
führt.
Beispieldaten
DECLARE @T TABLE (TeamA varchar(50), TeamB varchar(50), Win varchar(50), dt int);
INSERT INTO @T (TeamA, TeamB, Win, dt) VALUES
('KKR','HYD','KKR',1),
('KKR','MUM','MUM',2),
('RCB','HYD','HYD',3),
('DEL','PUB','PUB',4),
('RR','PUB','RR',4),
('RR','DEL','RR',5),
('RCB','CSK','CSK',6),
('RR','CSK','RR',7),
('CSK','MUM','MUM',7),
('MUM','DEL','MUM',8),
('HYD','PUNE','PUNE',9),
('PUB','DEL','DEL',9),
('KKR','DEL','KKR',10),
('KKR','RCB','KKR',10),
('A','B','A',11),
('A','B','A',12),
('A','B','A',13),
('A','B','A',14),
('A','B','B',15),
('A','B','B',16),
('A','B','B',17),
('A','B','B',18),
('A','B','B',19),
('A','B','B',20),
('A','B','B',21),
('A','B','A',22),
('A','B','A',23),
('A','B','A',24),
('A','B','A',25);
Abfrage
Normalerweise würden Sie eine Liste der Teams in einer separaten Tabelle haben, hier habe ich es in einem CTE_Teams
bauen. CTE_Counts
hat die Nummer 3-wins-in-a-row
für jede aufeinanderfolgende Siegesserie. Da es für ein Team mehrere Gewinnsträhne geben kann (siehe Team A
), wird dies weiter zusammengefasst.Teams können in beliebiger Reihenfolge in den Spalten TeamA
und TeamB
aufgeführt werden, so dass in der WHERE
innerhalb der CROSS APPLY
ein OR
zur Erfassung beider Varianten steht.
Wählen Sie also für jedes Team nur die Zeilen aus, die für dieses Team relevant sind. Dies geschieht durch CROSS APPLY
.
Dann klassische durch Nummerierung der Zeilen zweimal mit unterschiedlicher Partitionierung. Unterschiede in den Zeilennummern ergeben die Gruppen (Inseln und Lücken).
Filter WHERE CTE_Teams.Team = CA.Win
lässt nur Inseln der Siegerteams.
Gruppierung nach CTE_Teams.Team
gibt die Größe der Insel an, d. H. Anzahl der Gewinne in einer Reihe.
Abfrage funktioniert in SQL Server 2008.
WITH
CTE_Teams
AS
(
SELECT T.TeamA AS Team
FROM @T AS T
UNION -- sic! not ALL
SELECT T.TeamB AS Team
FROM @T AS T
)
,CTE_Counts
AS
(
SELECT
CTE_Teams.Team
--,CA.Win
--,rn1 - rn2 AS GroupNumber
--,COUNT(*) AS GroupSize
,COUNT(*)/3 AS FinalCount
FROM
CTE_Teams
CROSS APPLY
(
SELECT
T.Win
,T.dt
,ROW_NUMBER() OVER (PARTITION BY CTE_Teams.Team
ORDER BY T.dt, T.TeamA, T.TeamB) AS rn1
,ROW_NUMBER() OVER (PARTITION BY CTE_Teams.Team, T.Win
ORDER BY T.dt, T.TeamA, T.TeamB) AS rn2
FROM @T AS T
WHERE
T.TeamA = CTE_Teams.Team
OR T.TeamB = CTE_Teams.Team
) AS CA
WHERE
CTE_Teams.Team = CA.Win
GROUP BY
CTE_Teams.Team
,CA.Win
,rn1 - rn2
HAVING COUNT(*)/3 > 0
)
SELECT
CTE_Counts.Team
,SUM(CTE_Counts.FinalCount) AS FinalCount
FROM CTE_Counts
GROUP BY CTE_Counts.Team
ORDER BY CTE_Counts.Team;
Ergebnis
+------+------------+
| Team | FinalCount |
+------+------------+
| A | 2 |
| B | 2 |
| MUM | 1 |
| RR | 1 |
+------+------------+
SQL Fiddle
ist Was ist Ihr dbms, MySQL oder SQL Server? – HoneyBadger
'Mysql' oder' SQL-server'? Was hast du bisher versucht? – Jens
Ich bin mit MS SQL Server 14 Geige –