Sqlite - 如果有相同的号码,如何查询呼叫日志继续获取单个记录只有连续记录计数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sqlite - 如果有相同的号码,如何查询呼叫日志继续获取单个记录只有连续记录计数?相关的知识,希望对你有一定的参考价值。

UniqueID | MobileNumber | createDate
-----------+---------+-----+------------+-----------
U_23121  | 987654        | 2013-02-05 
U_23124  | 987654        | 2013-02-02 
U_23122  | 845263        | 2013-01-18 
U_23128  | 654789        | 2013-01-16 
U_23123  | 735689        | 2013-01-12 
U_23128  | 654789        | 2013-01-11 
U_23128  | 654789        | 2013-01-10 
U_23126  | 987654        | 2013-01-09 
U_23125  | 845263        | 2013-01-07 
U_23126  | 845263        | 2013-01-06 
U_23125  | 987654        | 2013-01-05 

我想记录像手机号码过滤,如果多于一个继续根据createdDate得到最新,并得到相同的计数

        UniqueID | Mobile_Number | createDate   | count
        -----------+---------+-----+------------+-----------
        U_23121  | 987654        | 2013-02-05   | 2
        U_23122  | 845263        | 2013-01-18   | 1
        U_23128  | 654789        | 2013-01-16   | 1
        U_23123  | 735689        | 2013-01-12   | 1
        U_23128  | 654789        | 2013-01-11   | 2
        U_23126  | 987654        | 2013-01-09   | 1
        U_23125  | 845263        | 2013-01-07   | 2
        U_23125  | 987654        | 2013-01-05   | 1

我会从以下查询获得需要的记录,但不会得到计数

SELECT te.*
FROM tableName as te
WHERE te.Mobile_Number <> (select Mobile_Number 
                           from tableName
                           where createDate > te.createDate
                           limit 1
                          )
ORDER BY te.createDate DESC
答案

这是一个间隙和岛屿问题。一种解决方案是为每行分配“grp”,然后按该组进行聚合。

您可以通过计算与每行中的移动号码不同的移动号码的数量来分配grp,直到该行。这是相邻移动号码的常量值。

结果查询:

SELECT MAX(UniqueId), MobileNumber,
       MAX(createDate), COUNT(*)
FROM (SELECT te.*,
             (SELECT COUNT(*)
              FROM tableName te2
              WHERE te2.createDate < te.createDate AND
                    te2.MobileNumber <> te.MobileNumber
             ) as grp
      FROM tableName te
     ) te
GROUP BY MobileNumber, grp;
ORDER BY MIN(tcreateDate) DESC
另一答案

好吧,这是差距和岛屿问题。如果您的Sqlite支持row_number函数(版本3.25及更高版本),那么您可以使用以下方法

select MobileNumber, max(createDate), count(*)
from
(
  select *,
       row_number() over (order by createDate) -
       row_number() over (partition by MobileNumber order by createDate) grp
  from data
) t
group by grp, MobileNumber
另一答案

使用GROUP BY

SELECT te.* FROM tableName as te where te.Mobile_Number != (select Mobile_Number from tableName where createDate > te.createDate limit 1) GROUP BY Mobile_Number  ORDER BY te.createDate DESC

以上是关于Sqlite - 如果有相同的号码,如何查询呼叫日志继续获取单个记录只有连续记录计数?的主要内容,如果未能解决你的问题,请参考以下文章

从电话号码获取 Lync 用户

J2ME Nokia 中带有特殊字符的呼叫号码

Twilio,如何将正在进行的呼叫转移到另一个号码

在 iOS 中以编程方式呼叫号码时显示联系人姓名

如果不使用 sqlite 中的 row_number() 函数,如何提供相同的函数?

如何在其他呼叫运行时以编程方式合并呼叫(电话会议)