2
votes

Sqlite - Comment faire une requête comme le journal des appels s'il y a le même numéro continuer à obtenir comme enregistrement unique avec un nombre d'enregistrements en continu uniquement?

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

8 commentaires

son mysql ou sqlite? ce sont des SGBD différents. S'il s'agit d'un mysql, écrivez la version que vous utilisez. J'ai changé les balises.


@ RadimBača est SQLITE


et quelle version de sqlite? avez-vous 3,25 ou plus?


Les requêtes sont nécessaires pour la base de données Android SQLITE alors peut-être que ce ne sont pas des versions d'effet.


pouvez-vous tester select row_number () over (order by createdate) from tablename query dans votre base de données?


Je ne sais pas comment j'ai utilisé row_number () selon ma table.


Ce n'est pas simple. Le row_number fonctionne pour vous? Je veux dire que le row_number est pris en charge?


oui row_number pris en charge sqlite


3 Réponses :


-1
votes

UTILISER LE GROUPE PAR

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


1 commentaires

grouper en combinant tous les mêmes enregistrements Mobile_Number que je veux combiner s'il y a le prochain est le même que par date, veuillez voir la question et l'exemple que je fournis. Merci @Ram



0
votes

Ok, c'est le problème des lacunes et des îles. Si votre Sqlite prend en charge la fonction row_number (version 3.25 et plus), vous pouvez utiliser l'approche suivante

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


2 commentaires

il y a une erreur avec votre requête près de "(" pouvez-vous exécuter une requête?


Je n'ai testé que sur PostgreSQL, cependant, cela devrait fonctionner si votre sqlite prend en charge row_number . Pouvez-vous essayer d'exécuter uniquement la sous-requête t et me le faire savoir?



1
votes

Il s'agit d'un problème de lacunes et d'îles. Une solution consiste à attribuer un "grp" à chaque ligne, puis à les agréger par ce groupe.

Vous pouvez attribuer le groupe en comptant le nombre de numéros de mobile qui sont différents du numéro de mobile dans chaque rangée, jusqu'à cette rangée. Il s'agit d'une valeur constante pour les numéros de mobile adjacents.

La requête résultante:

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 commentaires