Sqlite - Как я могу запросить, как журнал вызовов, если есть тот же номер, продолжать получать как одну запись с непрерывным счетчиком только? - PullRequest
0 голосов
/ 03 января 2019
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 

Я хочу записать, как фильтрация с номером мобильного телефона, если более одного продолжит, получит последнюю информацию на основе созданной даты и получит счет за это, например

        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

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Хорошо, это проблема пробелов и островков.Если ваш 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
0 голосов
/ 03 января 2019

Это проблема пробелов и островков. Одним из решений является присвоение «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
0 голосов
/ 03 января 2019

ИСПОЛЬЗУЙТЕ ГРУППУ ПО

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
...