你如何计算表中连续日期的数量?

时间:2012-02-28 01:14:25

标签: android sql sqlite

在我的Android应用程序中,我需要跟踪保存在数据库表中的连续日期的最长条纹和当前条纹。我甚至不知道从哪里开始工作。我能想到的最好的方法是查询表中的每一行,并以编程方式遍历所有行,以找出存在差距的位置。不是很有效率。谁有更好的想法?

2 个答案:

答案 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