【问题标题】:Sqlite - How to i query like call log if there is same number continue get as single record with continuously record count only?Sqlite - 如果有相同的号码继续获取为单条记录且仅连续记录计数,我如何查询通话记录?
【发布时间】:2019-01-03 06:10:10
【问题描述】:
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

【问题讨论】:

  • 它的mysql还是sqlite?这些是不同的 DBMS。如果是 mysql,则编写您正在使用的版本。我已经更改了标签。
  • @RadimBača 是 SQLITE
  • 哪个版本的sqlite?你有 3.25 或更多吗?
  • 是 android SQLITE db 的查询需求,所以可能不是效果版本。
  • 你能在你的数据库中测试select row_number() over (order by createdate) from tablename 查询吗?

标签: android sql database gaps-and-islands


【解决方案1】:

这是一个孤岛问题。一种解决方案是为每一行分配一个“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

【讨论】:

    【解决方案2】:

    好的,这就是间隙和孤岛问题。如果你的 Sqllite 支持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
    

    【讨论】:

    • 您的查询在“(”附近有错误,您可以运行查询吗?
    • 我只在 PostgreSQL 上进行了测试,但是,如果您的 sqlite 支持 row_number,它应该可以工作。你能尝试只运行子查询t 并告诉我吗?
    【解决方案3】:

    使用分组方式

    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
    

    【讨论】:

    • 通过合并所有相同的 Mobile_Number 记录进行分组,如果有下一个与每个日期相同,我将要合并,请参阅我提供的问题和示例。谢谢@Ram
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多