我有一个表,其中包含num_client,天,周,并且我想计算每周的客户数 这是表中的一些数据:
num_client, day, week
1 01/01/2018 1
2 01/01/2018 1
.
.
.
1 09/01/2018 2
3 10/01/2018 2
.
.
.
.
1 28/01/2018 5
1 01/02/2018 5
2 01/02/2018 5
5 01/02/2018 5
。 。 。 依此类推。
我按功能分组,一切正常。 问题是,当我尝试在汇总查询中添加星期几时,有些星期的间隔太小了, 就像2018年的第5周,它包含两个月,一月和二月。
所以我想到的是看天数:如果第二周的第五周比一月多,那么第五周的月份就是二月。 而且每年。 他们在oracle中有任何动态功能吗?
答案 0 :(得分:2)
这是一种根据您所说的逻辑(例如,如果一周中的最后一个日期是日期的第1,第2,第3或第4个)生成日期及其对应的星期和星期-月份值的列表的方法。月,该周属于上个月):
WITH week_months AS (SELECT dt,
dt_week_start,
dt_week_end,
to_number(to_char(dt, 'ww')) week_no,
to_number(CASE WHEN TRUNC(dt_week_start, 'mm') != TRUNC(dt_week_end, 'mm') AND to_char(dt_week_end, 'dd') < '05' THEN to_char(dt_week_start, 'mm')
ELSE to_char(dt_week_end, 'mm')
END) mnth
FROM (SELECT to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL dt,
trunc(to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL, 'ww') dt_week_start,
trunc(to_date('01/01/2018', 'dd/mm/yyyy') -1 + LEVEL, 'ww') + 6 dt_week_end
FROM dual
CONNECT BY LEVEL <= 400))
SELECT *
FROM week_months
ORDER BY dt;
您可以动态地使用它(您必须更改week_months子查询中的内部选择以选择您感兴趣的日期;这里我只是从2018年1月1日开始选择了400天,但您可能需要表中的最小/最大日期),但是根据查询运行的频率,您可能会发现最好填充一个表,然后使用该表连接到其他表。