2015-04-21 9 views
4

У меня есть запрос, который дает мне COUNT между двумя датами, start_date & end_date и сгруппирован по различным столбцам. Есть ли способ получить COUNT на каждый день? Как и в случае с start_date, date1 и end_date - date5, поэтому мне нужно выполнить запрос один раз для «date1 to date2», «date1 to date3», затем «date1 to date4», затем «date1 to date5». Как при запуске одного и того же запроса несколько раз в зависимости от начала & даты окончания? Мой запрос выглядитSQL Runnnig тот же запрос несколько раз

Select COUNT(A), B, C, D 
FROM TABLE 
WHERE CONDITION1 AND DATE BETWEEN start_date AND end_date 
GROUP BY B, C, D 
+0

Какая СУБД для этого?Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

ответ

4
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 в группе

Если поле даты и времени, то используйте 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 в группе

Edited на основе ОП:

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 

вы должны использовать цикл и сделать некоторые вещи, как выше

+0

Что делать, если дата недоступна в таблице, но показывать 0 против этой даты? – Jankya

+0

означает, что дата подачи не доступна ..? – Backtrack

+0

* Если поле является datetime, используйте конвертер * Если это имеет значение, SQL Server 2005 не имеет 'DATE' в качестве типа. –

1

Я покажу, как я могу добиться этого с 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 

Если вы не хотите за один день диапазоны (например, 4/1/2015 - 4/1/2015) просто изменить BEGIN_DATE < = end_date to begin_date < end_date.

После того, как вы есть, что вы можете присоединиться весь запрос к запросу вы работаете:

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; 

Вот SQLFiddle: http://sqlfiddle.com/#!4/9628d/9

Я надеюсь, что помогает.

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