在我的 Android 应用程序中,我需要跟踪保存在数据库表中的连续日期的最长连续记录和当前连续记录。我什至不知道从哪里开始让它工作。我能想到的最好办法是查询表中的每一行,并以编程方式遍历所有行以查找存在差距的地方。效率不高。谁有更好的想法?
最佳答案
这是我认为非常酷的纯 SQL 解决方案。假设你的表中的日期是唯一的(并不是说只对它们进行分组会太难)你可以使用从这里改编的方法 http://www.sqlteam.com/article/detecting-runs-or-streaks-in-your-data .我运行了这个例子,发现有一些语法错误,所以希望我没有在下面的回答中重复这些错误。我可能使用了一些保留关键字,因此您可能需要对其进行调整。
首先创建一个非常大的日期表来满足您的需求。我不确定 SQLite 的最佳方法是什么,但在 SQL Server 中,您可以将整数插入 Datetime 字段,它会将整数隐式转换为日期。有很多方法可以将整数插入表中...
无论如何,创建 Dates 表后,使用您的 dates 表中的最小和最大日期作为范围限制器,从 Dates 表到 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
关于android - 你如何计算表格中连续日期的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9474979/