2015-06-17 2 views
0

Я хочу, чтобы у моего запроса была динамическая дата. Теперь, как это написано, мне придется вручную менять дату каждый раз. В качестве примера см. Приведенное ниже:Postgres SQL - Как создать динамическую переменную даты

(select* 
from table2 
    where table2.begin_timestamp::date = '2015-04-01')as start 
left outer join 
(Select * 
from table 1 
    where opened_at::date >= ('2015-04-01' - 15) 
    and opened_at::date <= '2015-04-01’) 

Я не хочу, чтобы «2015-04-01» был жестко закодирован. Я хочу снова и снова запускать этот запрос для ряда дат.

+2

Как вы выбираете дату? Похоже, вы просто хотите последние 15 календарных дней. – marceljg

+0

В основном мой запрос, который намного больше, чем это говорит: возьмите дату X из таблицы 2 и дайте мне все покупки продукта. Затем из таблицы 1 выберите все данные за последние 15 дней с даты покупки. В конце запроса я могу сказать, что один человек купил автомобиль 4/1/2015 (таблица 2) и в течение 15 дней после совершения этой покупки он проверил автомобиль на 4 разных дня (таблица 1). Но я хочу запустить этот запрос для всех дат в течение определенного периода времени (например, в апреле), как мне сделать динамическую дату, поэтому мне не нужно вручную корректировать каждый день каждый раз, когда я запускаю его. – AmberLaw

+0

Я предполагаю, что мне нужно используйте некоторый тип функции цикла, но я не уверен, как это сделать. - любая помощь будет принята с благодарностью – AmberLaw

ответ

0

Использование нормального соединения, вы можете сделать это в пункте on п или where но не внутри подзапрос. Это приводит к логике, как это:

from (select* 
     from table2 
    ) start left outer join 
    table 1 
    on opened_at::date >= table2.begin_timestamp::date - interval '15 day' and 
     opened_at::date <= table2.begin_timestamp::date 
+0

Привет, Гордон - спасибо за ваш ответ, но я боюсь, что это не так просто. Этот запрос массивный. Я просто собрал быстрый фрагмент того, с чем я работал, чтобы правильно изобразить мой вопрос. - Боюсь, мне нужен какой-то цикл. Мне хотелось бы создать переменную даты, которая будет проходить через определенный диапазон дат. Затем в моем запросе укажите эту переменную везде, где появляется дата. Есть ли у вас какие-либо идеи о том, как это сделать? Я не могу найти что-либо в Интернете, которое решает эту проблему. Ваша помощь очень ценится. – AmberLaw

0

Я не разработчик Postgres, но я думаю, что вы можете адаптировать технику из SQL-сервер мира под названием «тальманские столы».

Вы также можете присоединиться к дням d и окну дней, которые не превышают 15 дней.

Вы можете использовать что-то вроде

SELECT * FROM generate_series('2015-04-01'::timestamp, 
           '2015-04-30 00:00', '1 days'); 

Чтобы создать последовательность дат, а оттуда вы можете написать что-то вроде

select * 
from table a 
join generate_series('2015-04-01'::timestamp,'2015-04-30','1 days') s(o) 
    on a.begin_timestamp::date = s.o 
join table2 b 
    on a.opened_at>= b.begin_timestamp::date - interval '15 days' 
    and opened_at::date <= table2.begintimestamp::date 

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

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