我的应用程序中有一个“通话记录”列表,但我希望将所有通话分组,只要它们是有序的(类似于android通话记录分组)。
我的意思是假设我们有这张表:
id | number | time
------------------------
1 | 2222 | 00:00
2 | 2222 | 01:15
3 | 5555 | 02:00
4 | 2222 | 03:15
5 | 2222 | 05:16
我需要的是一个看起来像这样的结果:
count | number
----------------
2 | 2222
1 | 5555
2 | 2222
但是通过使用常规GROUP BY
,我得到了这个结果:
count | number
----------------
4 | 2222
1 | 5555
有人可以帮我查询吗?
答案 0 :(得分:4)
这是一种复杂的查询,但我至少会尝试解释它; - )
为了获得良好的分组,您可以为每一行计算具有较少时间的行数与当前行数不同的行数。这将使具有相同数字的所有连续行具有相同的值,因为连续的数字将具有相同数量的其他数字。
要使其真正独一无二,只需将其与数字本身连接即可,这样您就可以在外部查询中轻松分组。
SELECT COUNT(*) "count", MIN(id) starting_id, number
FROM (
SELECT a.id, a.number, a.number || '-' || COUNT(b.id) seq
FROM mytable a
LEFT JOIN mytable b
ON a.id > b.id AND a.number <> b.number
GROUP BY a.id, a.number
)
GROUP BY seq
ORDER BY id;