2011-04-09 19 views

Respuesta

8

Puede hacerlo uniéndose a la mesa consigo mismo (realizando lo que se denomina Cartesian o cross join). Vea el siguiente ejemplo.

SELECT a.name, a.gdppc, SUM(b.gdppc) 
FROM gdppc AS a, gdppc AS b WHERE b.gdppc <= a.gdppc 
GROUP BY b.id ORDER BY a.gdppc; 

Dado un cuadro que contiene los países y su PIB per cápita le dará un total acumulado de la cifra del PIB.

Democratic Republic of Congo|329.645|329.645 
Zimbabwe|370.465|700.11 
Liberia|385.417|1085.527 
Burundi|399.657|1485.184 
Eritrea|678.954|2164.138 
Niger|711.877|2876.015 
Central African Republic|743.945|3619.96 
Sierra Leone|781.594|4401.554 
Togo|833.803|5235.357 
Malawi|867.063|6102.42 
Mozambique|932.511|7034.931 
... 

Tenga en cuenta que esto puede ser una operación muy intensivo de los recursos, ya que si una tabla tiene N elementos se creará una tabla temporal con elementos N * N. No lo realizaría en una mesa grande.

+0

Gracias. En su ejemplo, ¿cuál es el nombre TABLE? – Hugo

+0

@Diomidis Spinellis: en realidad no es una combinación cruzada, sino más bien una [combinación triangular] (http://www.sqlservercentral.com/articles/T-SQL/61539/). –

+0

Lo siento pero no entendí. En la declaración FROM ¿dónde debería escribir mi nombre TABLE? – Hugo

-1

Tienes que hacer una suma en el campo que desea .... La consulta depende de la base de datos que está utilizando, Oracle le permite hacer esto:

select id, value, sum(value) as partial_sum over (order by id) from table 
1

combinación cruzada soluciones como sugirieron Diomidis Spinellis tomar el tiempo O (N^2). Un CTE recursivo puede funcionar más rápido, si puede soportar el código intrincado.

Esto produce la misma salida que la suya.

WITH RECURSIVE running(id, name, gdppc, rt) AS (
    SELECT row1._rowid_, row1.name, row1.gdppc, COALESCE(row1.gdppc,0) 
    FROM gdppc AS row1 
    WHERE row1._rowid_ = (
     SELECT a._rowid_ 
     FROM gdppc AS a 
     ORDER BY a.gdppc, a.name, a._rowid_ 
     LIMIT 1) 
    UNION ALL 
    SELECT row_n._rowid_, row_n.name, row_n.gdppc, COALESCE(row_n.gdppc,0)+running.rt 
    FROM gdppc AS row_n INNER JOIN running 
    ON row_n._rowid_ = (
     SELECT a._rowid_ 
     FROM gdppc AS a 
     WHERE (a.gdppc, a.name, a._rowid_) > (running.gdppc, running.name, running.id) 
     ORDER BY a.gdppc, a.name, a._rowid_ 
     LIMIT 1)) 
SELECT running.name, running.gdppc, running.rt 
FROM running; 

pedidos y las comparaciones se encargan de duplicados, COALESCE está ahí para ignorar los valores NULL.

Si tiene un buen índice, este debería ser O (N log N). Como SQLite no es compatible con los cursores, una solución O (N) probablemente no exista sin depender de una aplicación externa.

Cuestiones relacionadas