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

标签 android sql sqlite

在我的 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/

相关文章:

android - sqlite 数据库 hardcode/data/db_path android

AndroidResultContracts.TakePicture() 返回 bool 值而不是位图

android - 我的 friend 如何测试我的 Android 应用程序?

sql - 在 Microsoft Access 中从 ... 中选择 Top (all but 10)

c# - 将列值作为 IEnumerable 返回

sqlite:别名列名不能包含点 "."

java - Android房间如何增加计数字段并更新特定的行字段

android - android market中的相关应用是如何计算的

mysql - 在数据库中存储动态字段的最佳实践

java - 无法读取用其他语言创建的 SQLite 数据库