按周分组数据Oracle

时间:2013-12-04 17:06:46

标签: sql database oracle plsql

我的查询结果包含以下列。 名称,价值,位置,日期 我希望还有两个包含开始日期和结束日期的列。开始日期是星期五,结束日期是下周四。周从2013年7月19日开始。我想对日期列进行分组。 我尝试使用WITH子句来生成周,但我必须进行笛卡尔连接并且连接断开。

  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,这个笛卡尔联接可以正常工作,但不能在其他数据库上运行。

输出应为

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

1 个答案:

答案 0 :(得分: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