Cómo quitar filas consecutivas con datos duplicados en ciertos campos (en SQLite)?
Digamos, por ejemplo, que tiene una tabla como esta:
------------------------------- Date Name Type 2017-01-01 John 1 2017-01-02 John 1 2017-01-03 Mike 2 2017-01-04 John 1 -------------------------------
Quiero ser capaz de agrupar por el tipo para obtener un resultado como el siguiente
- ¿Detectando la transacción olvidada de SQLite en Android usando StrictMode?
- SQLite onUpgrade ()
- Preferencias compartidas vs base de datos
- Leer datos de sqlite donde nombre de columna contiene espacios en android
- Android: ¿Dónde se almacenan los archivos de base de datos?
------------------------- Name Type John 1 Mike 2 John 1 -------------------------
Como se puede ver las dos primeras filas se agruparon porque no hay ningún tipo diferente entre ellos, como lo que se ve en los registros de llamadas de teléfonos móviles.
¿Cómo puedo lograr eso en SQLite?
- Base de datos LocalStorage vs Sqlite
- CursorLoader, obtiene URI para la base de datos local
- Android cierre y apertura de base de datos SQLite en el nivel de aplicación
- Uso de la base de datos existente en Android Wear
- Android / ORMLite Insertar fila con ID
- Exportar la base de datos SQLite al archivo csv en android
- Android: ListView con CheckBox, poblado desde la base de datos SQLite no funciona
- Aplicación de Android y myBatis
Puede hacer esto con una tabla de temp ordenada y algunas comparaciones rowid:
sqlite> create table t (date, name, type); sqlite> insert into t (date, name, type) values ( '2017-01-01', 'John', 1); sqlite> insert into t (date, name, type) values ( '2017-01-02', 'John', 1); sqlite> insert into t (date, name, type) values ( '2017-01-03', 'Mike', 2); sqlite> insert into t (date, name, type) values ( '2017-01-04', 'John', 1); sqlite> create temp table tp as select date, name, type from t order by date; sqlite> delete from tp where tp.name = (select name from t where t.rowid = tp.rowid - 1) and tp.type = (select type from t where t.rowid = tp.rowid - 1); sqlite> select * from tp; 2017-01-01|John|1 2017-01-03|Mike|2 2017-01-04|John|1 sqlite>
La consulta siguiente logra esto por un NOT EXISTS
para los mismos valores de Name
y Type
en la fila anterior (si existe). La fila anterior se encuentra buscando la fecha máxima que es estrictamente inferior a la fecha de la fila actual.
SELECT * FROM tbl t1 WHERE NOT EXISTS ( SELECT * FROM tbl t2 WHERE t2.Name = t1.Name AND t2.Type = t1.Type AND t2.`Date` = (SELECT MAX(`Date`) FROM tbl t3 WHERE t3.`Date` < t1.`Date`) );
Demostración de SQL Fiddle: http://sqlfiddle.com/#!5/0700cb/3
- La mejor manera de asegurarse de que los juegos Android se ejecuten a la misma velocidad en cualquier dispositivo
- Inicio de FragmentActivity de la actividad con intención