Android SQLite查询-按连续序列分组
我正在寻找sql在SQLite上运行 我有这个表(3个整数列)和数据(这里是数据的子集) 我想要下面的adur结果,其中表是a)从最大ID到最小ID排序的,b)当两个或多个aids连续相同时,将adur相加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 我尝试了以下方法。它不能提
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