Выполнение SQL-запроса с внутренним ВЫБОРОМ

#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, для вашей информации, когда в таблице доступно больше записей, выполнение запроса занимает так много времени из-за внутреннего соединения с запросом