2013-12-04 6 views
0

У меня есть результат запроса со следующими столбцами. Имя, значение, местоположение, дата Я хочу иметь еще две колонки с датой начала и окончания. Дата начала - пятница недели, а дата окончания - в следующий четверг. неделя начинается с 07/19/2013. Я хочу сгруппировать столбец даты. Я попытался использовать предложение WITH для генерации недель, но мне нужно сделать декартовое соединение и разрыв соединения.Группировка данных по неделям Oracle

WITH Q1 AS 
(SELECT dates AS start_date , dates + 6 AS end_date FROM 
     (SELECT DATE '2013-07-18' + LEVEL-1 dates FROM DUAL CONNECT BY LEVEL <= (TRUNC(SYSDATE)- DATE '2013-07-18')) 
    WHERE TO_CHAR(dates,'DY') = 'FRI' 
) 
Select q1.Start_date, q1.end_date, t.name, t.value, t.date 
from test1 t,Q1 
where date between q1.start_date and Q1.end_date; 

У меня есть exadata, на которой это Cartesian соединение работает отлично, но не в другой базе данных.

Выход должен быть

Start date End date Name value Date 
---------- -------- ---- ----- -------- 
07/19/2013 07/25/2013 A  5  07/22/2013 
07/19/2013 07/25/2013 b  3  07/23/2013 
07/26/2013 08/01/2013 c  6  08/01/2013 
08/02/2013 08/08/2013 A  2  08/06/2013 
--- 
-- 
-- 
11/29/2013 12/05/2013 t  5  12/01/2013 
11/29/2013 12/05/2013 s  3  12/02/2013 
11/29/2013 12/05/2013 t  5  12/02/2013 
+0

Не знаете, почему вы считаете, что вам нужно декартово соединение. В псевдо-sql: 'select previous_sunday (date), follow_saturday (дата), дата, имя, значение, местоположение из ...' где 'previous_sunday (date)' и 'follow_saturday (date)' - выражения, которые вычисляют начало и даты окончания. –

+0

@jimgarrison, я обновил свой вопрос, чтобы ответить на ваше декартовое соавторство. Я хочу писать по-другому. Как-то я получаю ORA-03113: конец файла на канале связи, но когда я запускаю другие запросы или что-то еще он работает отлично, что говорит, что он должен что-то сделать с этим запросом. –

ответ

1

TRUNC (дата, 'IW') делает трюк - считает первый день недели. Тогда это просто арифметика.

select to_date('07/18/2013', 'mm/dd/yyyy') + rownum cur_date, 
     TRUNC((to_date('07/18/2013', 'mm/dd/yyyy') + rownum) - 4, 'IW') + 4 as start_date, 
     TRUNC((to_date('07/18/2013', 'mm/dd/yyyy') + rownum) + 3, 'IW') + 3 as end_date 
    from dual connect by level <= 100; 

CUR_DATE START_DATE END_DATE 
------------------------------------- 
19-JUL-13 19-JUL-13 25-JUL-13 
20-JUL-13 19-JUL-13 25-JUL-13 
21-JUL-13 19-JUL-13 25-JUL-13 
22-JUL-13 19-JUL-13 25-JUL-13 
23-JUL-13 19-JUL-13 25-JUL-13 
24-JUL-13 19-JUL-13 25-JUL-13 
25-JUL-13 19-JUL-13 25-JUL-13 
26-JUL-13 26-JUL-13 01-AUG-13 
27-JUL-13 26-JUL-13 01-AUG-13 
28-JUL-13 26-JUL-13 01-AUG-13 
29-JUL-13 26-JUL-13 01-AUG-13 
30-JUL-13 26-JUL-13 01-AUG-13 
31-JUL-13 26-JUL-13 01-AUG-13 
01-AUG-13 26-JUL-13 01-AUG-13 
Смежные вопросы