Вот решение только для SQL, которое мне показалось действительно классным. Предполагая, что даты в вашей таблице уникальны (не то, чтобы просто было сгруппировать их), вы можете использовать адаптированный здесь метод http://www.sqlteam.com/article/detecting-runs-or-streaks-in-your-data. Я пробежался по примеру и есть некоторые синтаксические ошибки, так что, надеюсь, Я не повторял их в своем ответе ниже. Вероятно, я использовал некоторые зарезервированные ключевые слова, поэтому вам может потребоваться адаптировать его.
Сначала создайте таблицу дат, которая будет достаточно большой, чтобы удовлетворить ваши потребности. Я не уверен, что лучший метод для SQLite, но в SQL Server вы можете вставить целые числа в поле Datetime, и он будет выполнять неявное преобразование целых чисел в даты. Есть много способов вставить целые числа в таблицы ...
В любом случае, после создания таблицы Dates выполните левое соединение таблицы Dates с таблицей Streak, используя минимальные и максимальные даты из таблицы Streak в качестве ограничителя диапазона. Затем у вас будет следующий код.
Давайте назовем это SQL 0
SELECT Dates.Date,
CASE
WHEN StreakTable.DATE IS NULL THEN 0
ELSE 1
END AS Result
FROM Dates
LEFT JOIN StreakTable
ON Dates.DATE = StreakTable.DATE
WHERE Dates.DATE BETWEEN (SELECT MIN(DATE) AS MinDate
FROM StreakTable) AND (SELECT MAX(DATE) AS MaxDate
FROM StreakTable)
Давайте назовем следующий SQL 1
SELECT Date,
Result,
(SELECT COUNT(*)
FROM (SQL 0) S
WHERE S.Result <> SV.Result
AND S.GameDate <= SV.GameDate) AS RunGroup
FROM (SQL 0) SV
Давайте назовем следующий SQL 2
SELECT Result,
MIN(Date) AS StartDate,
MAX(Date) AS EndDate,
COUNT(*) AS Days
FROM (SQL 1) A
GROUP BY Result,
RunGroup
ORDER BY MIN(Date)
На данный момент вы можете сделать несколько очень интересных вещей, таких как ответ
Какой была самая длинная полоса?
SELECT TOP 1 *
FROM (SQL 2) A
WHERE Result = 1
ORDER BY Games DESC
Какая текущая полоса на последнюю дату?
SELECT *
FROM (SQL2) A
WHERE EndDate = (SELECT Max(Date)
FROM Streak)
Сколько полос 3 или более у нас было?
SELECT Result,
COUNT(*) as NumberOfStreaks
FROM (SQL 2) A
GROUP BY Result
WHERE Days >= 3