SQL Runnnig один и тот же запрос несколько раз
У меня есть запрос, который дает мне COUNT между двумя датами, start_date & end_date и группируется по различным столбцам. Могу ли я получить COUNT за каждый день? Например, start_date - это date1, а end_date - date5, поэтому мне нужно выполнить запрос один раз для "date1 to date2", "date1 to date3", затем "date1 до date4", затем "date1 до date5". Как выполнить один и тот же запрос несколько раз в зависимости от даты начала и окончания? Мой запрос выглядит
Select COUNT(A), B, C, D
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date
GROUP BY B, C, D
2 ответа
Select COUNT(A), B, C, D,DATE
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date
GROUP BY B, C, D,DATE
добавлять DATE
в группе по
Если поле имеет значение datetime, используйте convert
(из @ta.speot.is: в SQL Server 2005 тип DATE отсутствует)
Select COUNT(A), B, C, D,convert(date,DATETime)
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date
GROUP BY B, C, D,convert(date,DATETime)
добавлять DATE
в группе по
Отредактировано на основе ОП:
declare increment int;
set increment = 1
declare tempdate date;
set tempdate = start_date
while (tempdate < end_date)
Select COUNT(A), B, C, D,DATE
FROM TABLE
WHERE CONDITION1 AND DATE BETWEEN start_date AND DATEADD(day,increment, start_date )
GROUP BY B, C, D,DATE
set increment = increment + 1
set tempdate = DATEADD(day,1,tempdate )
end
Вы должны использовать цикл и сделать что-то вроде выше
Я покажу, как добиться этого с Oracle, а затем, как это можно применить к Vertica.
Я начинаю с написания запроса, чтобы получить список дат. Как это:
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as begin_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy') - to_date('01-APR-2015','dd-mon-yyyy')+1;
Это возвращает:
01-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM
04-APR-15 12:00:00 AM
05-APR-15 12:00:00 AM
Я не слишком знаком с Vertica, но, похоже, этого можно достичь с помощью этого запроса:
SELECT ts::DATE
FROM (SELECT '04/01/2015'::TIMESTAMP as tm
UNION
SELECT '04/05/2015'::TIMESTAMP as tm) as t
TIMESERIES ts as '1 Day' OVER (ORDER BY tm);
(Источник: http://www.vertica-forums.com/viewtopic.php?t=1333)
Затем я использую декартово / перекрестное объединение для того же запроса, чтобы создать диапазоны дат:
select *
from (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as begin_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q1, (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as end_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q2
where begin_date <= end_date;
Результаты выглядят так:
BEGIN_DATE END_DATE
01-APR-15 12:00:00 AM 01-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 02-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 03-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
01-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 02-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 03-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
02-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM 03-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
03-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
04-APR-15 12:00:00 AM 04-APR-15 12:00:00 AM
04-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
05-APR-15 12:00:00 AM 05-APR-15 12:00:00 AM
Если вы не хотите, чтобы диапазоны одного дня (например, 01.04.2015 - 01.04.2015) просто измените begin_date <= end_date на begin_date После этого вы можете присоединить весь запрос к выполняемому запросу: Вот SQLFiddle: http://sqlfiddle.com/ Надеюсь, это поможет.Select q.begin_date, q.end_date, t.B, t.C, t.D, count(t.A)
FROM tmp t, (
select *
from (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as begin_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q1, (
select to_date('01-APR-2015','dd-mon-yyyy') + rownum -1 as end_date
from all_objects
where rownum <= to_date('05-APR-2015','dd-mon-yyyy')-to_date('01-APR-2015','dd-mon-yyyy')+1
) q2
where begin_date <= end_date
) q
where t.theDate between q.begin_date and q.end_date
group by q.begin_date, q.end_date, t.B, t.C, t.D
order by q.begin_date, q.end_date;