Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite查询-按连续序列分组_Android_Sql_Sqlite - Fatal编程技术网

Android SQLite查询-按连续序列分组

Android SQLite查询-按连续序列分组,android,sql,sqlite,Android,Sql,Sqlite,我正在寻找sql在SQLite上运行 我有这个表(3个整数列)和数据(这里是数据的子集) 我想要下面的adur结果,其中表是a)从最大ID到最小ID排序的,b)当两个或多个aids连续相同时,将adur相加 ID aid adur adur 7 1 2 11 6 1 9 5 2 9 9 4 3 5 20 3 3 8 2 3 7 1 1 5 5 我尝试了以下方法。它不能提

我正在寻找sql在SQLite上运行

我有这个表(3个整数列)和数据(这里是数据的子集)

我想要下面的adur结果,其中表是a)从最大ID到最小ID排序的,b)当两个或多个aids连续相同时,将adur相加

ID  aid adur    adur 
7   1   2       11
6   1   9
5   2   9       9
4   3   5       20
3   3   8   
2   3   7   
1   1   5       5
我尝试了以下方法。它不能提供期望的结果,因为它一次对表中的所有ADUR进行分组/求和,而不是对那些ADUR进行分组/求和,只是这些ADUR背对背(连续)相同

创建一个
分区行号
ID
中减去它以创建分组并进行数学运算,然后再进行匹配。此方法要求
ID
为无间隙的递增数字。如果
ID
可能有间隙,那么您只需要在整个表中创建一个
行号
,然后使用该行号创建分组

如果
ID
有间隙,请使用此间隙:

SELECT t.*, g.SumAdur
FROM
    Table t
    LEFT JOIN (
       SELECT
          r.aid
          ,MIN(r.Id) as MinId
          ,MAX(r.Id) as MaxId
          ,SUM(r.adur) as SumAdur
       FROM
          (
             SELECT *
                ,(SELECT COUNT(*) FROM Table tc
                    WHERE t.Id >= tc.Id AND t.aid = tc.aid) as AidRowNum
                ,(SELECT COUNT(*) FROM Table tc
                    WHERE t.Id >= tc.Id) as IdRowNum                
             FROM
                Table t
          )r
       GROUP BY
          r.aid
          ,r.IdRowNum - r.AidRowNum
    ) g
    ON t.Id = g.MaxId
ORDER BY
    t.Id DESC
如果希望在每一行上显示值,只需更改:

ON t.Id = g.MaxId

创建一个
分区行号
ID
中减去它以创建分组并进行数学运算,然后再进行匹配。此方法要求
ID
为无间隙的递增数字。如果
ID
可能有间隙,那么您只需要在整个表中创建一个
行号
,然后使用该行号创建分组

如果
ID
有间隙,请使用此间隙:

SELECT t.*, g.SumAdur
FROM
    Table t
    LEFT JOIN (
       SELECT
          r.aid
          ,MIN(r.Id) as MinId
          ,MAX(r.Id) as MaxId
          ,SUM(r.adur) as SumAdur
       FROM
          (
             SELECT *
                ,(SELECT COUNT(*) FROM Table tc
                    WHERE t.Id >= tc.Id AND t.aid = tc.aid) as AidRowNum
                ,(SELECT COUNT(*) FROM Table tc
                    WHERE t.Id >= tc.Id) as IdRowNum                
             FROM
                Table t
          )r
       GROUP BY
          r.aid
          ,r.IdRowNum - r.AidRowNum
    ) g
    ON t.Id = g.MaxId
ORDER BY
    t.Id DESC
如果希望在每一行上显示值,只需更改:

ON t.Id = g.MaxId


对于给定的
辅助工具
,是否需要所有行的总和?谢谢!只有那些连续的行。(背靠背)。在上一个表格示例中……所有辅助1的预期结果为前11(adur 9+adur 2,因为这两个1背对背),5,因为该adur/行是单独的。援助2也是如此。答案是9,因为只有一个援助2。对于aid 3,有三个背靠背,因此这三个ADUR的总和为20。表中可以有超过3个连续行吗?是的,表中可以有超过3个连续行。对于给定的
aid
,是否需要所有行的总和?谢谢!只有那些连续的行。(背靠背)。在上一个表格示例中……所有辅助1的预期结果为前11(adur 9+adur 2,因为这两个1背对背),5,因为该adur/行是单独的。援助2也是如此。答案是9,因为只有一个援助2。对于aid 3,有三个背靠背,所以这三个ADUR的总和是20。表中可以有3个以上的连续行吗?是的,表中可以有3个以上的连续行。非常棒的解决方案!谢谢你,马特。SQLite是否支持上述所有语法?非常棒的解决方案!谢谢你,马特。SQLite是否支持上述所有语法?
ON t.Id = g.MaxId
ON t.Id BETWEEN g.MinId AND g.MaxId