Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#1456: 2016-07-26 01:06:03 ЛС | профиль | цитата
Есть таблица test:

id integer primary key
id2 integer (число от 1 до 9999)
dt textchar default value (datetime('now','localtime'))

Требуется найти наибольшее id2 за каждый день в диапазоне дат.
Как я понял нужно составить конструкцию с вложенным запросом и алиасом (AS)

select max(t1) from (select id2 from test where date(dt) between date('2016-07-01') and date ('2016-07-10') AS t1 order by date(dt));
танцы с бубном и примеры с сайта sqlite пока не помогают, прошу помочь с логикой запроса "выдай мне максимальное\последнее значение id2 и таблицы test за каждую дату в диапазоне таком то",ни как не могу понять как пользоваться алиасами (AS)

карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1457: 2016-07-26 07:00:12 ЛС | профиль | цитата
Попробуй так :
#sql
SELECT max(id2)
FROM test
WHERE date(dt) BETWEEN date('2016-07-01') and date('2016-07-10') -- период по дате
GROUP BY date(dt); -- группировать по дате
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 655
Рейтинг: 18
#1458: 2016-08-03 17:31:23 ЛС | профиль | цитата
Спасибо!
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1459: 2016-08-08 16:22:28 ЛС | профиль | цитата
http://agp1.hx0.ru/.SQLite.Allow.pdf

--- Добавлено в 2016-08-29 22:30:43

Три подключаемые функции для работы с русским текстом в SQLite.
FirstChar, Upper, Lower.
В архиве пример работы с ними.

Редактировалось 6 раз(а), последний 2016-08-30 16:18:56
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
файлы: 2SQLite_Function_RU.rar [1.8KB] [559], SQLite_function.JPG [44.1KB] [1053]
Голосовали:miver
Ответов: 16884
Рейтинг: 1239
#1460: 2016-10-23 16:34:13 ЛС | профиль | цитата
Цикл (for) в SQLite


Add(MainForm,2953706,84,112)
{
Point(onClose)
link(onCreate,11933428:doOpen,[])
link(onClose,11933428:doClose,[])
}
Add(ComboBox,4205602,266,126)
{
Left=110
Top=14
Height=21
Font=[MS Sans Serif,8,1,0,1]
ReadOnly=0
DropDownCount=33
Point(EditText)
Point(doSelect)
Point(onSelect)
Point(onSetFocus)
}
Add(SQLite_DB,11933428,140,126)
{
FileName=":memory:"
link(onOpen,15352880:doEvent1,[])
}
Add(SQLite_Query,836308,217,126)
{
SQL="WITH RECURSIVE cnt(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM cnt WHERE x<100)\r\nSELECT A - x FROM cnt,(SELECT strftime('%Y','now') AS A);\r\n"
link(onQuery,4205602:doAdd,[])
}
Add(Hub,15352880,189,126)
{
link(onEvent1,836308:doQuery,[])
link(onEvent2,6551292:doData,[(209,139)(209,174)])
}
Add(DoData,6551292,217,168)
{
Data=Integer(0)
link(onEventData,4205602:doSelect,[])
}

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 758
Рейтинг: 112
#1461: 2016-10-24 10:32:44 ЛС | профиль | цитата
Tad писал(а):
Цикл (for) в SQLite
А какая версия SQlite нужна
У меня с sqlite3.dll из HiAsm не работает
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#1462: 2016-10-25 06:58:31 ЛС | профиль | цитата
Последняя - http://www.sqlite.org/download.html
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 413
Рейтинг: 57
#1463: 2017-01-02 21:58:30 ЛС | профиль | цитата
Доброе время суток.
Подскажите как грамотно добавить колонку (столбец) в таблицу базы SQLite?
Условия такие: нужно проверить базу на наличие колонки с требуемым именем, если такая колонка есть, то ничего не делать, а если нет, то добавить колонку и расположить её второй.

Я пытаюсь решать по такому алгоритму:
Сперва делаю запрос: "pragma table_info(table);". Получаю список имен столбцов и еще какие-то "0" (индексы или тригеры или ещё что-то не знаю).
Затем поиском в этом списке ищу искомое название колонки и если его нет, то создаю временную таблицу и переношу туда все значения с существующей, а в новую колонку записую NULL.
Затем удаляю оригинальную таблицу и переименовываю новую созданную.

Можно ли это реализовать только запросом к SQLite и как грамотнее это сделать.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#1464: 2017-01-03 22:46:00 ЛС | профиль | цитата
Самой малой кровью:
Poputchik писал(а):
проверить базу на наличие колонки с требуемым именем
Для этого выполняешь запрос:
SELECT <колонка с требуемым именем> FROM <имя таблицы>;
Если в ответ на точке onError
no such column: <колонка с требуемым именем>
тогда добавляешь колонку
ALTER TABLE <имя таблицы> ADD COLUMN <колонка с требуемым именем>; и в неё "автоматом запишется" NULL
(один SQLite_Query, один IF_Else, три FormatStr)

Редактировалось 3 раз(а), последний 2017-01-03 23:24:01
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 413
Рейтинг: 57
#1465: 2017-01-04 00:58:39 ЛС | профиль | цитата
Добавить то получается, вопрос немного в другом:
Poputchik писал(а):
добавить колонку и расположить её второй

Похоже что простым способом это не получится и колонка всегда добавляется самой последней. Это ладно.
Вот только не пойму почему в одном DSC_Query не добавляются столбцы в несколько таблиц:
ALTER TABLE "имя 1 таблицы" ADD column "имя колонки" char;
ALTER TABLE "имя 2 таблицы" ADD column "имя колонки" char;
Если поочередно подавать команды в DSC_Query то добавляет.
И ещё вопрос: команду VACUUM; нужно выполнять после добавления колонки или нет?
карма: 0

0
Разработчик
Ответов: 4697
Рейтинг: 426
#1466: 2017-01-04 03:12:06 ЛС | профиль | цитата
Tad писал(а):
Для этого выполняешь запрос:
SELECT <колонка с требуемым именем> FROM <имя таблицы>;

А может стоит делать этот запрос с LIMIT 1, чтобы, если данных много, он не тормозил?
карма: 10
1
Голосовали:Poputchik
Ответов: 16884
Рейтинг: 1239
#1467: 2017-01-04 10:07:07 ЛС | профиль | цитата
Assasin писал(а):
А может стоит делать этот запрос с LIMIT 1, чтобы, если данных много, он не тормозил?
Тоже верно (если такая колонка уже есть).
Poputchik писал(а):
добавить колонку и расположить её второй
А это зачем ?
БД - это полная анархия. Ни порядок записей, ни порядок колонок, для получения нужного результата, не имеет никакого значения. Изначально так и задумывалась.
Скорее всего ты что-то намудрил со структурой БД.
Poputchik писал(а):
Вот только не пойму почему в одном DSC_Query не добавляются столбцы в несколько таблиц
Так устроено наше DSC_Query.
Poputchik, что это за задача, которая решается добавлением колонок ?
Сколько занимаюсь БД - ни разу не добавлял колонки.

Редактировалось 6 раз(а), последний 2017-01-04 10:31:04
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#1468: 2017-01-04 10:41:31 ЛС | профиль | цитата
Poputchik писал(а):
Вот только не пойму почему в одном DSC_Query не добавляются столбцы в несколько таблиц

Потому, что DSC_Query каждый в своей транзакции, а в одной транзакции нельзя обращаться на запись к разным таблицам, так же, как и делать VACUUM, он просто не сработает.
Poputchik писал(а):
команду VACUUM; нужно выполнять после добавления колонки или нет?

Не обязательно, тк VACUUM предназначен для очистки пустых мест в таблице, те сжатия таблицы после удаления, тк данные после удаления остаются в таблице занимая место.
карма: 22

1
Голосовали:Poputchik
Ответов: 16884
Рейтинг: 1239
#1469: 2017-01-04 21:31:31 ЛС | профиль | цитата
Poputchik писал(а):
команду VACUUM; нужно выполнять после добавления колонки или нет?
nesco писал(а):
VACUUM предназначен для очистки пустых мест в таблице
Не только. Vacuum также устраняет фрагментацию таблиц, что вполне может произойти при добавлении колонок.
====================================
Если работать по такой схеме
Poputchik писал(а):
Затем поиском в этом списке ищу искомое название колонки и если его нет, то создаю временную таблицу и переношу туда все значения с существующей, а в новую колонку записую NULL.
Затем удаляю оригинальную таблицу и переименовываю новую созданную.
то Vacuum не нужен.

Редактировалось 1 раз(а), последний 2017-01-04 21:32:52
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Poputchik
Ответов: 413
Рейтинг: 57
#1470: 2017-01-05 02:09:38 ЛС | профиль | цитата
Tad писал(а):
Скорее всего ты что-то намудрил со структурой БД.

Когда создавал программу, структура базы казалась правильной и достаточной, но, спустя пару лет ведения нескольких баз разными пользователями, потребовалось в уже существующих базах вести учет ещё одного параметра (по крайней мере во вновь добавляемые данные). Считывание данных из базы выполняется "SELECT * FROM '%1' WHERE ...", т.е. не указаны названия колонок, а все по порядку, вот и хотел разместить новую колонку в удобное место. К базам у меня доступа нет и я стараюсь не ошибиться чтоб их не испортить своей программой. Вот и спросил: "Как грамотнее и нужен ли VACUUM?"
Assasin, nesco, Tad - спасибо за подсказки.

P.S.
Вопрос не по теме: В HiAsm можно найти все места в схеме где расположены глобальные переменные с одни именем включая "ссылки" или нет?

Редактировалось 1 раз(а), последний 2017-01-05 02:22:35
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)