2015-03-18 2 views
1

Я написал запрос в SQLite, который кумулирует VALUE, и это хорошо, если я заказываю только по ID (ID - auto increment int). Но, если я хочу заказать по DATE, а затем по ID, запрос показывает мне неправильные результаты. Есть идеи?Накопительный SUM в SQLite

Запрос:

select t1.ID, 
     t1.DATE, 
     t1.VALUE, 
     sum(t2.VALUE) as TOTAL  
from test t1 
inner join test t2 on t1.DATE >= t2.DATE and t1.id >= t2.id 
group by t1.ID, t1.DATE 
order by t1.DATE desc, t1.ID desc 

Результаты:

ID DATE  VALUE TOTAL 
9 2015-01-16 55  281 -- should be 226 + 55 = 281 
6 2015-01-15 10  26 -- should be 216 + 10 = 226 
5 2015-01-15 5  16 -- should be 211 + 5 = 216 
8 2015-01-14 100  211 
7 2015-01-14 100  111 
4 2015-01-13 5  11 
3 2015-01-12 3  6 
2 2015-01-11 2  3 
1 2015-01-10 1  1 
+0

Дополнительная проблема заключается в том, что идентификатор отправляется на 3 символа в длину или больше, но с той же датой. – Arnes

+0

Сколько данных мы говорим? И является ли заказ подходящим или предопределенным? – Captain

+0

Неограниченные данные, но он будет ограничен 50. Заказ предопределен. – Arnes

ответ

1

По крайней мере, на небольших данных, изменение присоединиться к чему-то вроде этого:

t1.DATE||substr('00000'||t1.id,-5) >= t2.DATE||substr('00000'||t2.id,-5) 

работает отлично ... Так мы создаем «ключ сортировки» на основе даты и идентификатора (с нулями до 5 цифр) и используя это в соединении. Возможно, потребуется построить индекс для этого, чтобы справиться с производительностью.

+0

Я знал это :) ... Спасибо. – Arnes

+0

Как создать правильный индекс. Результаты медленные. :( – Arnes

+0

@Arnes - похоже, вам может понадобиться сохранить этот ключ сортировки в столбце ... этого может быть достаточно, чтобы ускорить его. Если не так, как здесь: https://www.sqlite.org/ lang_createindex.html – Captain

Смежные вопросы