Sql 使用model子句展开日期
我有几种不同类型的数据涉及日期范围,我想将它们合并在一起,但同时按日期进行细分。因此,一段3天的数据将产生三行:Sql 使用model子句展开日期,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有几种不同类型的数据涉及日期范围,我想将它们合并在一起,但同时按日期进行细分。因此,一段3天的数据将产生三行: start primary_key start+1 primary_key start+2 primary_key 我一直在10g中使用select语句的model子句,并在寻找实现这一点的最佳方法。目前我加入了一系列的日期,涵盖了所有可能的日期选择minstart日期,maxend日期。我更喜欢选择数据并添加更多行,以将其转换为每日数据集 编辑: 我已经设法提出了以下示
start primary_key
start+1 primary_key
start+2 primary_key
我一直在10g中使用select语句的model子句,并在寻找实现这一点的最佳方法。目前我加入了一系列的日期,涵盖了所有可能的日期选择minstart日期,maxend日期。我更喜欢选择数据并添加更多行,以将其转换为每日数据集
编辑:
我已经设法提出了以下示例数据:
SELECT * FROM (
SELECT 123 req_code,
345 req_par_code,
TO_DATE('01-03-2010', 'dd-mm-yyyy') req_start_date,
TO_DATE('05-03-2010', 'dd-mm-yyyy') req_end_date
FROM dual
)
MODEL
PARTITION BY (req_code)
DIMENSION BY (0 d)
MEASURES (SYSDATE dt, req_par_code, req_start_date, req_end_date)
RULES ITERATE(365) UNTIL (dt[iteration_number] >= TRUNC(req_end_date[0])) (
dt[iteration_number] = NVL(dt[iteration_number-1] + 1, TRUNC(req_start_date[0])),
--Copy data across
req_par_code[ iteration_number ] = req_par_code[0],
req_start_date[ iteration_number ] = req_start_date[0],
req_end_date[ iteration_number ] = req_end_date[0]
)
ORDER BY dt, req_code;
将为您提供从2009年1月1日到今天的所有日期的列表。您可以使用MODEL子句生成行,下面是一个小示例:
SQL> SELECT * FROM t_data;
PK START_DATE END_DATE
---------- ----------- -----------
1 20/01/2010 20/01/2010
2 21/01/2010 23/01/2010
3 24/01/2010 27/01/2010
SQL> SELECT pk, start_date, end_date FROM t_data
2 MODEL
3 PARTITION BY (pk)
4 DIMENSION BY (0 AS i)
5 MEASURES(start_date, end_date)
6 RULES
7 ( start_date[FOR i
8 FROM 1 TO end_date[0]-start_date[0]
9 INCREMENT 1] = start_date[0] + cv(i),
10 end_date[ANY] = start_date[CV()] + 1
11 )
12 ORDER BY 1,2;
PK START_DATE END_DATE
---------- ----------- -----------
1 20/01/2010 21/01/2010
2 21/01/2010 22/01/2010
2 22/01/2010 23/01/2010
2 23/01/2010 24/01/2010
3 24/01/2010 25/01/2010
3 25/01/2010 26/01/2010
3 26/01/2010 27/01/2010
3 27/01/2010 28/01/2010
但是如果我有诸如:01/01/10到03/01/10 01/02/10到03/02/10这样的数据,并且想要以6行结束,我仍然需要计算要制造多少个日期,然后跨行连接,这不是我试图实现的。如何给出CREATE TABLE和INSERT命令,并指出您实际期望的内容。
SQL> SELECT * FROM t_data;
PK START_DATE END_DATE
---------- ----------- -----------
1 20/01/2010 20/01/2010
2 21/01/2010 23/01/2010
3 24/01/2010 27/01/2010
SQL> SELECT pk, start_date, end_date FROM t_data
2 MODEL
3 PARTITION BY (pk)
4 DIMENSION BY (0 AS i)
5 MEASURES(start_date, end_date)
6 RULES
7 ( start_date[FOR i
8 FROM 1 TO end_date[0]-start_date[0]
9 INCREMENT 1] = start_date[0] + cv(i),
10 end_date[ANY] = start_date[CV()] + 1
11 )
12 ORDER BY 1,2;
PK START_DATE END_DATE
---------- ----------- -----------
1 20/01/2010 21/01/2010
2 21/01/2010 22/01/2010
2 22/01/2010 23/01/2010
2 23/01/2010 24/01/2010
3 24/01/2010 25/01/2010
3 25/01/2010 26/01/2010
3 26/01/2010 27/01/2010
3 27/01/2010 28/01/2010