powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Вопрос про Select
13 сообщений из 13, страница 1 из 1
Вопрос про Select
    #38733498
mtgate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые.
Сам бьюсь над задачкой, решить не могу. Базовые книги прочитал, эксперементировал в SQLite Database Browser но так ничего и не вышло. Сдаюсь и прошу помочь

База:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE TABLE  symb (
                    id INTEGER NOT NULL PRIMARY KEY,
                    DT DATETIME,
                    PRICE REAL,
                    TV INTEGER,
                    BD REAL,
                    AK REAL
                    );

INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:01", 13800, 1, 13800, 13801);
INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:01", 13800, 1, 13800, 13801);
INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:02", 13800, 1, 13800, 13801);

INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:03", 13800, 5, 13799, 13800);

INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:03", 13800, 4, 13800, 13801);

INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:03", 13801, 1, 13800, 13801);
INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:04", 13801, 1, 13800, 13801);

INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:05", 13801, 1, 13801, 13802);
INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:06", 13801, 2, 13801, 13802);

INSERT INTO symb   (DT,PRICE,TV ,BD,AK) VALUES ("2014-08-30 10:20:06", 13802, 1, 13802, 13803);



Инсерты я специально визуально разделил на строки, которые мне нужно суммировать.

Что мне нужно получить на выходе с помощью запроса:
Дожны суммироваться TV при одинаковых PRICE,BD,AK и сортировать по ID. Поле DT должно быть последнее, которое было insert


DTPRICETVBDAK"2014-08-30 10:20:02"1380031380013801"2014-08-30 10:20:03"13800 5 13799 13800"2014-08-30 10:20:03" 13800 4 13800 13801"2014-08-30 10:20:04" 13801 2 13800 13801"2014-08-30 10:20:06" 13801 3 13801 13802"2014-08-30 10:20:06" 13802 1 13802 13803


С уважением
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733527
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtgate,

А в чем проблема заключается?
Код: sql
1.
2.
3.
select max(dt) dt, price, sum(tv) tv, bd, ak
from symb
group by price, bd, ak
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733529
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtgateDTPRICETVBDAK"2014-08-30 10:20:02"1380031380013801"2014-08-30 10:20:03"1380041380013801

А где собственно значение ID? Автоинкремент?
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733531
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADАвтоинкремент
Опс, он автоматом проставляет. Писал первое сообщение с телефона Android, в той версии немного по другому...
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733538
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtgate,

Запрос будет выполняться в приложении или в каком окружении?
Думаю проще будет написать пользовательский агрегат, который будет сравнивать отличается ли "предыдущие" значения price, bd, ak от текущих. Если отличаются - то суммировать, иначе, сбрасывать сумматор на 0, грубо говоря.
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733586
mtgate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLADmtgate,

А в чем проблема заключается?
Код: sql
1.
2.
3.
select max(dt) dt, price, sum(tv) tv, bd, ak
from symb
group by price, bd, ak



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

dt price tvbdak13.06.2014 1:00:00 13555 1 13555 13555 13.06.2014 1:00:00 13555 1 13555 13555 13.06.2014 1:00:01 13554 3 13554 1355613.06.2014 1:00:01 13555 2 13554 1355513.06.2014 1:00:01 13554 3 13554 13555 13.06.2014 1:00:02 13555 2 13554 13555 13.06.2014 1:00:02 13555 1 13554 13555

что должно быть на выходе

dt price tvbdak13.06.2014 1:00:00 13555 1 13555 13555 13.06.2014 1:00:01 13554 3 13554 1355613.06.2014 1:00:01 13555 2 13554 1355513.06.2014 1:00:01 13554 3 13554 13555 13.06.2014 1:00:02 13555 3 13554 13555

а вот что получается в реальности
dt price tvbdak13.06.2014 1:00:00 13555 2 13555 13555 13.06.2014 1:00:01 13554 3 13554 1355513.06.2014 1:00:01 13554 3 13554 1355613.06.2014 1:00:00 13555 5 13554 13555

Сразу видно, что данные групируются од одинаковым price bd и ak со всего участка, а мне нужно с последовательности до первого изменения.
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733588
mtgate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLADmtgateDTPRICETVBDAK"2014-08-30 10:20:02"1380031380013801"2014-08-30 10:20:03"1380041380013801

А где собственно значение ID? Автоинкремент?
да, это Автоинкремент. собственно сортировка может быть и по DT, это не самое важное.
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733640
mtgate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот еще мои размышления.
Оператор Group By видимо мне не подходит, так как он группирует по всем данным.

Скорее мне нужны такие действия:

1. price=bd
Код: sql
1.
select * from symb where  price=bd



2. price=ak
Код: sql
1.
select * from symb where  price=ak



3. объединить первые два пункта

4. отсортировать пункт 3 по dt
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733754
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читал, читал... ниче не понял.
Объясни что тебе нужно на других данных. Цифры меньше, разница между ними больше. Длинные поля с одной буквой разницы очень неудобны для расшифровки...
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733779
mtgate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
постараюсь )

Исходные данные

ID DTPRICETVBDAK1 "02" 100 1 100 1502 "02" 100 1 100 1503 "03" 100 1 100 1504 "11" 100 1 100 1505 "11" 125 1 125 1506 "12" 140 1 125 1407 "13" 140 1 125 1408 "13" 140 1 125 1409 "13" 100 1 100 15010"14" 100 1 100 150

должно превратиться в
ID DTPRICETVBDAK4"11" 100 4 100 1505"11" 125 1 125 1508"13" 140 3 125 14010"14" 100 2 100 150

=====================================================

Сам процесс анализа сейчас опишу:
данные должны анализироваться последовательно по колонке DT:
ID DTPRICETVBDAK1 "02" 100 1 100 1502 "02" 100 1 100 1503 "03" 100 1 100 1504 "11" 100 1 100 150
в первых 4х строчках колонки PRICE, BD и AK одинаковые, значит берем самый большой DT из этих 4х строчек, а TV суммируем
и выходит
ID DTPRICETVBDAK4"11" 100 4 100 150

дальше одна строка
IDDTPRICETVBDAK5"11" 125 1 125 150
так как следующая за ней строка уже другая по колонкам PRICE, BD и AK то заносим ее неизменно, как есть

дальше идут три одинаковые строки
IDDTPRICETVBDAK6 "12" 140 1 125 1407 "13" 140 1 125 1408 "13" 140 1 125 140
снова DT самый большой, TV суммируем и выходит
ID DTPRICETVBDAK8"13" 140 3 125 140

последние две строки по аналогии
из
ID DTPRICETVBDAK9"13" 100 1 100 15010"14" 100 1 100 150
в
ID DTPRICETVBDAK10"14" 100 2 100 150

спасибо
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733781
mtgate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и вдогонку еще вопрос:
по совету VSVLAD попробовал изменить структуру БД
добавил еще одну колонку, обозвал ее idprice и по условию увеличиваю ее на единицу

получилась такая таблица


ID DT PRICE TV BD AK idprice1 "02" 100 1 100 15012 "02" 100 1 100 15013 "03" 100 1 100 15014 "11" 100 1 100 15015 "11" 125 1 125 15026 "12" 140 1 125 14037 "13" 140 1 125 14038 "13" 140 1 125 14049 "13" 100 1 100 150510 "14" 100 1 100 1505

применил
Код: sql
1.
SELECT dt, price, bd, ak, SUM(TV) FROM symb WHERE DT>="1" AND DT<="1000" group by idprice


Вывод занял 5 секунд из 10.000 строк
Почему так долго ? у меня в программе тупой последовательный перебор меньше времени занимает

индексы по idprice и dt построены
...
Рейтинг: 0 / 0
Вопрос про Select
    #38733782
mtgate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
модераторам:
в предыдущем посте напутал с последней колонкой

должно быть :


ID DT PRICE TV BD AK idprice1 "02" 100 1 100 150 12 "02" 100 1 100 150 13 "03" 100 1 100 150 14 "11" 100 1 100 150 15 "11" 125 1 125 150 26 "12" 140 1 125 140 37 "13" 140 1 125 140 38 "13" 140 1 125 140 39 "13" 100 1 100 150 410 "14" 100 1 100 150 4

если возможно замените таблицу
...
Рейтинг: 0 / 0
Вопрос про Select
    #38734512
mtgate
Код: sql
1.
SELECT dt, price, bd, ak, SUM(TV) FROM symb WHERE DT>="1" AND DT<="1000" group by idprice


Вывод занял 5 секунд из 10.000 строк
Почему так долго ? у меня в программе тупой последовательный перебор меньше времени занимает

индексы по idprice и dt построены

То, что индекс есть, ещё не означает что СУБД будет его использовать при выполнении запроса...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Вопрос про Select
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]