在我的Android应用程序中,我需要跟踪保存在数据库表中的连续日期的最长条纹和当前条纹。我甚至不知道从哪里开始工作。我能想到的最好的方法是查询表中的每一行,并以编程方式遍历所有行,以找出存在差距的位置。不是很有效率。谁有更好的想法?
答案 0 :(得分:1)
基本上你一个月都有一个月和几天 所以你只需要将天数与所需数量进行比较。
如果存在差距,您可以通过减去一个月中的天数来轻松找到它。例如。你有count(days_visited) where month=1
并且它返回20天,但January has 31
所以11天内有差距,这里是sqlite的日期函数
http://www.sqlite.org/lang_datefunc.html
您可以使用以下功能
比如SELECT date('now','start of year','+9 months','weekday 2');
EDIT
创建表访问(day_visited timestamp,visited int);
您每天在此表中创建一条记录
用户是在线还是离线
'now',1 or 0
(在线/离线)。然后你跑过那里的记录。
您的月份记录将是一个1和0的int数组。
叫vistedrecordsformonth
伪代码:
int online=0;
int offline=0;
for(int i=0;i<vistedrecordsformonth.size();i++){
boolean flag=false;
if(vistedrecordsformonth[i]==1){ //visited
if(!flag&&i!=0) //check for flag and not 0 index to insert a record
{
streaksMap.put(online,offline); //or insert a record into another streakmap or table
online=0;
offline=0;
}
flag=true;
online++;
}
else{
flag=false;
offline++;
}
} //end of for
地图或表格将包含一个月的在线=离线天数。
通常情况order by
,您可以看到在线或离线时期最大的连胜纪录。
这很难看我知道我确定应该有更优雅的东西,但是 它应该快速而肮脏。
希望它有助于升技。
答案 1 :(得分:1)
这是一个我认为非常酷的SQL解决方案。假设您的表中的日期是唯一的(并不是仅仅将它们分组太难),您可以使用从此处http://www.sqlteam.com/article/detecting-runs-or-streaks-in-your-data改编的方法。我试过这个例子并且有一些语法错误,所以希望我在下面的答案中没有重复它们。我可能使用了一些保留关键字,因此您可能需要对其进行调整。
首先创建一个日期表,这个日期非常大,可以满足您的需求。我不确定SQLite的最佳方法是什么,但在SQL Server中,您可以将整数插入到Datetime字段中,它会将整数隐式转换为日期。有很多方法可以将整数插入表格中......
无论如何,一旦创建了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