我试图模仿Apple的iOS在电话应用程序中排序通话记录的方式。
他们对电话进行排序的方式如下:
(original list)
—————————————————————
John - (Incoming) - 10.30 am
John - (Missing) - 10.00 am
John - (Outgoing) (3) - 09.00 am
John - (Outgoing) - Wednesday
(An incoming call is done)
—————————————————————
John - (Incoming) (2) - 10.30 am <-- this row gets grouped (2)
John - (Missing) - 10.00 am
John - (Outgoing) (3) - 09.00 am
John - (Outgoing) - Wednesday
(A missed call came)
—————————————————————
John - (Missing) - 10.35 am <-- this row gets added (but not grouped with (*))
John - (Incoming) (2) - 10.30 am
John - (Missing) - 10.00 am --> (*)
John - (Outgoing) (3) - 09.00 am
John - (Outgoing) - Wednesday
基本上,这个App正在做的事情如下:
它从数据库中获取所有调用,如果两个或多个调用类型相等(缺失,传入或传出),并且也是下一行,它们被分组为一行,数字指示符显示分组量否则,只需将行添加到表视图中,不会有任何奇怪的操作。
我尝试做的事情是,当下一行与前一行的类型相同时,按类型分组。我知道如何使用代码执行此操作,但我想知道是否有任何方法可以通过仅限SQL 来实现。
答案 0 :(得分:0)
最好是你共享一个你已经创建了DDL语句的小提琴sql并且所有的支持都可以找到最好的查询,但假设你有一个表,这里有3列我可以写的。
select name, type_of_call, count(type_of_call), last(call_time) from call_history
group by name, type_of_call;
答案 1 :(得分:0)
在MySQL中,您可以使用变量执行此操作:
select calltype, count(*) as numcalls, max(calltime)
from (select ch.*,
(@rn := if(@t = type_of_call, @rn,
if(@t := type_of_call, @rn + 1, @rn + 1)
)
) as grp
from CallHistory ch cross join
(select @rn := 0, @t := '') vars
order by calltime
) ch
group by grp, calltype;
这是添加&#34;排名&#34;变量到调用类型。变量仅在调用类型更改时递增。输出查询将值组合在一起以提供&#34;摘要&#34;信息。