#sql #sqlite
#sql #sqlite
Вопрос:
У меня есть 3 таблицы, и у меня есть запрос, который отображает новую таблицу, где каждая строка заполнена этим:
SELECT rov.*
FROM report_or_vals rov
WHERE rov.or_group_indice_id = 1
AND report_date BETWEEN ? AND ?
Следовательно, вторая строка будет:
SELECT rov.*
FROM report_or_vals rov
WHERE rov.or_group_indice_id = 2
AND report_date BETWEEN ? AND ?
Вопрос make — это место, где я помещаю свой NSDate
объект (iOS, объект objective-c для даты удержания).
Мой вопрос в том, как изменить этот запрос, чтобы отобразить дополнительные столбцы? Какое значение должно быть равно: (значение строки в инструкции выше) — (значение строки после инструкции), где инструкция после аналогичной инструкции, но с датой, уменьшенной на один день.
Итак, если у меня значение строки на сегодня равно 10, а предыдущий день равен 7, я хочу, чтобы мой оператор содержал что-то вроде: column_today_value (равно 10), column_difference_value (равно 3 (10-7)).
Как добиться этого с помощью языка SQL? Извините, я разработчик iOS. и не совсем знаком с функциями SQL. Но я надеюсь, что это на самом деле простая задача.
Комментарии:
1. оператор where после аналогичного оператора, но с датой, уменьшенной на один день. в этот единственный день дата уменьшается на единицу из
NSDate
?2. MySQL и SQLite — это два разных продукта. Пожалуйста, удалите ненужный
3. @Evgeniy Kleban, для вашей информации, когда в таблице доступно больше записей, выполнение запроса занимает так много времени из-за внутреннего соединения с запросом
4. @chiragpatel хорошо, спасибо, я буду иметь в виду
Ответ №1:
Я понимаю, что вопрос заключается в следующем: как нам отобразить список ежедневных значений и разницу между значением каждого дня и значением предыдущего дня
Для этого я использую самосоединение.
SELECT [TODY].value AS [VALUE]
, [YEST].value AS [PREV_VALUE]
, [TODY].value - [YEST].value AS [DIFFERENCE]
, '[TODY].value - [YEST].value = '
CAST([TODY].value - [YEST].value
AS varchar
) AS [WHATS_HAPPENING]
, [YEST].*
FROM report_or_vals AS [YEST]
INNER JOIN report_or_vals AS [TODY]
ON [YEST].date = DATE([TODY].DATE,'-1 day')
/* IF YOU COMMENT THE WHERE CLAUSE YOU WILL SEE VALUES FOR ALL THE DAYS
WHERE [TODY].or_group_indice_id = 2
AND report_date BETWEEN ? AND ?
*/
Это то, что вы хотите?
Комментарии:
1. @EvgeniyKleban, для вашей информации, когда в таблице доступно больше записей, выполнение этого запроса занимает так много времени, потому что внутреннее соединение с запросом
2. Чтобы ускорить это объединение, вы можете попробовать создать индекс в столбце даты. sqlite.org/lang_createindex.html
Ответ №2:
Я надеюсь, что приведенное ниже решение подойдет вам.
SELECT rov.* , rov.vals - (select row.vals from report_or_vals where report_or_vals.date = (NSDate - 1))
FROM report_or_vals rov
WHERE rov.or_group_indice_id = 2
AND report_date BETWEEN ? AND ?
Комментарии:
1. @Evgeniy Kleban, для вашей информации, когда в таблице доступно больше записей, выполнение запроса занимает так много времени из-за внутреннего соединения с запросом