2008-10-25 12 views
6

Tengo una tabla SQLite que contiene los precios de varios productos. Es una tabla de instantáneas, por lo que contiene los precios en intervalos de 5 minutos. Me gustaría escribir una consulta que devuelva la diferencia de precio de una fila a la siguiente en cada artículo.Encontrar la diferencia en filas en la consulta usando SQLite

Las columnas son id (inc automático), record_id (Identificación del producto), el precio (precio en ese punto en el tiempo), el tiempo (sólo unos segundos desde el periodo)

Estoy intentando devolver un ' columna 'diferencia' que contiene un valor de diferencia entre intervalos.

 
Given the following 

id  record_id  price time 
1  apple001  36.00 ... 
67  apple001  37.87 ... 
765  apple001  45.82 ... 
892  apple001  26.76 ... 

I'd like it to return 
id  record_id  price time difference 
1  apple001  36.00 ...  0 
67  apple001  37.87 ...  1.87 
765  apple001  45.82 ...  7.95 
892  apple001  26.76 ...  -19.06 

¿Es posible con SQLite?

En segundo lugar, ¿debería ser posible? ¿Hay alguna forma de limitarlo a los últimos 5 registros?

Agradecería cualquier ayuda, gracias.


Solo quería agregar algunas cosas. He encontrado formas de hacerlo en otras bases de datos, pero estoy usando XULRunner, por lo tanto, SQLite. Por eso estoy trabajando con eso.

La segunda pregunta puede necesitar aclaración, estoy buscando para ordenar por el momento y tomar y analizar los últimos 5 registros. Es un problema que puedo abordar por separado si es necesario.

Aquí hay un MySQL solution, tipo de. Es el enfoque hacia el que me estoy dirigiendo, pero el factor decisivo es "Si la tabla contiene una columna de secuencia pero hay espacios vacíos, vuelva a numerarla. Si la tabla no contiene dicha columna, agregue una". Por diseño, este escenario tiene vacíos, ya que hay muchos registros actualizados a la vez y no estarán en orden.

Respuesta

8

No sé si hay algunas limitaciones en SQLite, pero puede probar las siguientes afirmaciones que están funcionando en el servidor Sql.

Si la diferencia de tiempo es constante (usted indica que se trata de 5 minutos), se puede escribir:

SELECT A.id, A.record_id, A.price, A.time, ISNULL(A.price - B.price, 0) AS difference 
FROM Table1 as A 
    LEFT OUTER JOIN Table1 B ON A.record_id = B.record_id AND A.time - B.time = 5 

lo contrario

SELECT A.id, A.record_id, A.price, A.time, ISNULL(A.price - B.price, 0) AS difference 
FROM Table1 as A 
    LEFT OUTER JOIN Table1 B ON B.record_id = A.record_id 
     AND B.time = (SELECT MAX(time) FROM Table1 C WHERE C.time < A.time AND C.record_id = A.record_id) 

una declaración sin uniones es la siguiente

SELECT id, record_id, price, time, 
    (SELECT A.price - B.price 
     FROM Table1 as B 
     WHERE B.record_id = A.record_id AND 
      B.time = (SELECT MAX(time) FROM Table1 C WHERE C.time < A.time AND C.record_id = A.record_id)) AS difference 
FROM Table1 as A 

Espero que uno de ellos te ayude.

+1

SQLite utiliza [ifnull] (http://www.sqlite.org/lang_corefunc.html#ifnull) –

+0

¿Es mejor tener las uniones o no tener las uniones, y por qué? – EngrStudent

Cuestiones relacionadas