具有日期 window 保留时间的 MAX 解析函数
MAX analytic function with date window preserving time
我正在尝试获取前几行 window 的最大日期。值得注意的是日期的实际时间部分。
实际 table 包含更多日期的数据,但查询位于一个函数中,该函数将日期作为参数以将数据限制为一天。
+---------------------------------------------------------------------+
¦FROM ¦ TO ¦ GRAPH ¦
+------+-------+------------------------------------------------------¦
¦09:00 ¦ 11:00 ¦ [--------] ¦
¦10:00 ¦ 10:30 ¦ [-] ¦
¦10:45 ¦ 12:00 ¦ [-------] ¦
¦13:00 ¦ 14:30 ¦ [--------] ¦
¦14:00 ¦ 15:00 ¦ [-----] ¦
¦15:30 ¦ 16:30 ¦ [----] ¦
¦16:30 ¦ 17:30 ¦ [-----] ¦
+---------------------------------------------------------------------+
-- show the time portion when querying, for convenience
alter session set nls_date_format = 'DD/MM/YYYY HH24:MI';
-- create an inline view with some data, perform select on it
with iv_dates (start_dt, end_dt) as (
select to_date('08/07/2016 09:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 11:00','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 10:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 10:30','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 10:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 12:00','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 13:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 14:30','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 14:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 15:00','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 15:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 16:30','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 16:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 17:30','DD/MM/YYYY HH24:MI') from dual
)
SELECT start_dt
, end_dt
, MAX (end_dt) OVER ( ORDER BY start_dt asc
RANGE BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING
)
max_end_dt
FROM iv_dates;
但是,我没有得到最大值 end_dt...
的任何结果
+--------------------------------------------------+
¦ START_DT ¦ END_DT ¦ MAX_END_DT ¦
+------------------+------------------+------------¦
¦ 08/07/2016 09:00 ¦ 08/07/2016 11:00 ¦ - ¦
¦ 08/07/2016 10:00 ¦ 08/07/2016 10:30 ¦ - ¦
¦ 08/07/2016 10:30 ¦ 08/07/2016 12:00 ¦ - ¦
¦ 08/07/2016 13:00 ¦ 08/07/2016 14:30 ¦ - ¦
¦ 08/07/2016 14:00 ¦ 08/07/2016 15:00 ¦ - ¦
¦ 08/07/2016 15:30 ¦ 08/07/2016 16:30 ¦ - ¦
¦ 08/07/2016 16:30 ¦ 08/07/2016 17:30 ¦ - ¦
+--------------------------------------------------+
不过只要我添加另一天的日期,它就会开始 "working"
+--------------------------------------------------------+
¦ START_DT ¦ END_DT ¦ MAX_END_DT ¦
+------------------+------------------+------------------¦
¦ 08/07/2016 09:00 ¦ 08/07/2016 11:00 ¦ - ¦
¦ 08/07/2016 10:00 ¦ 08/07/2016 10:30 ¦ - ¦
¦ 08/07/2016 10:30 ¦ 08/07/2016 12:00 ¦ - ¦
¦ 08/07/2016 13:00 ¦ 08/07/2016 14:30 ¦ - ¦
¦ 08/07/2016 14:00 ¦ 08/07/2016 15:00 ¦ - ¦
¦ 08/07/2016 15:30 ¦ 08/07/2016 16:30 ¦ - ¦
¦ 08/07/2016 16:30 ¦ 08/07/2016 17:30 ¦ - ¦
¦ 09/07/2016 09:00 ¦ 09/07/2016 11:00 ¦ 08/07/2016 11:00 ¦
¦ 09/07/2016 10:00 ¦ 09/07/2016 10:30 ¦ 08/07/2016 11:00 ¦
¦ 09/07/2016 10:30 ¦ 09/07/2016 12:00 ¦ 08/07/2016 12:00 ¦
+--------------------------------------------------------+
只是为了说明这一点 - 我不需要分区,我只希望它能在我的数据上工作一天。
但是 windowing 子句似乎因为日期数据类型而表现不同。我不想要那样 - 我只是希望它根据排序在实际的前一行上工作,而不是在 (date - 1)
上工作。是因为这是约会吗,我该如何处理?
如果您正在使用 ORDER BY start_dt asc range BETWEEN UNBOUNDED PRECEDING 1 PRECEDING
Oracle 计算当前行的逻辑偏移量。
例子。
对于示例的第一行,范围是 08/07/2016 09:00
和 07/07/2016 09:00
因为 (start_dt - 1) = 08/07/2016 09:00 -1
= 07/07/2016 09:00
。
.
将范围更改为行
我正在尝试获取前几行 window 的最大日期。值得注意的是日期的实际时间部分。
实际 table 包含更多日期的数据,但查询位于一个函数中,该函数将日期作为参数以将数据限制为一天。
+---------------------------------------------------------------------+
¦FROM ¦ TO ¦ GRAPH ¦
+------+-------+------------------------------------------------------¦
¦09:00 ¦ 11:00 ¦ [--------] ¦
¦10:00 ¦ 10:30 ¦ [-] ¦
¦10:45 ¦ 12:00 ¦ [-------] ¦
¦13:00 ¦ 14:30 ¦ [--------] ¦
¦14:00 ¦ 15:00 ¦ [-----] ¦
¦15:30 ¦ 16:30 ¦ [----] ¦
¦16:30 ¦ 17:30 ¦ [-----] ¦
+---------------------------------------------------------------------+
-- show the time portion when querying, for convenience
alter session set nls_date_format = 'DD/MM/YYYY HH24:MI';
-- create an inline view with some data, perform select on it
with iv_dates (start_dt, end_dt) as (
select to_date('08/07/2016 09:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 11:00','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 10:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 10:30','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 10:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 12:00','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 13:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 14:30','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 14:00','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 15:00','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 15:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 16:30','DD/MM/YYYY HH24:MI') from dual
union all
select to_date('08/07/2016 16:30','DD/MM/YYYY HH24:MI'), to_date('08/07/2016 17:30','DD/MM/YYYY HH24:MI') from dual
)
SELECT start_dt
, end_dt
, MAX (end_dt) OVER ( ORDER BY start_dt asc
RANGE BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING
)
max_end_dt
FROM iv_dates;
但是,我没有得到最大值 end_dt...
的任何结果+--------------------------------------------------+
¦ START_DT ¦ END_DT ¦ MAX_END_DT ¦
+------------------+------------------+------------¦
¦ 08/07/2016 09:00 ¦ 08/07/2016 11:00 ¦ - ¦
¦ 08/07/2016 10:00 ¦ 08/07/2016 10:30 ¦ - ¦
¦ 08/07/2016 10:30 ¦ 08/07/2016 12:00 ¦ - ¦
¦ 08/07/2016 13:00 ¦ 08/07/2016 14:30 ¦ - ¦
¦ 08/07/2016 14:00 ¦ 08/07/2016 15:00 ¦ - ¦
¦ 08/07/2016 15:30 ¦ 08/07/2016 16:30 ¦ - ¦
¦ 08/07/2016 16:30 ¦ 08/07/2016 17:30 ¦ - ¦
+--------------------------------------------------+
不过只要我添加另一天的日期,它就会开始 "working"
+--------------------------------------------------------+
¦ START_DT ¦ END_DT ¦ MAX_END_DT ¦
+------------------+------------------+------------------¦
¦ 08/07/2016 09:00 ¦ 08/07/2016 11:00 ¦ - ¦
¦ 08/07/2016 10:00 ¦ 08/07/2016 10:30 ¦ - ¦
¦ 08/07/2016 10:30 ¦ 08/07/2016 12:00 ¦ - ¦
¦ 08/07/2016 13:00 ¦ 08/07/2016 14:30 ¦ - ¦
¦ 08/07/2016 14:00 ¦ 08/07/2016 15:00 ¦ - ¦
¦ 08/07/2016 15:30 ¦ 08/07/2016 16:30 ¦ - ¦
¦ 08/07/2016 16:30 ¦ 08/07/2016 17:30 ¦ - ¦
¦ 09/07/2016 09:00 ¦ 09/07/2016 11:00 ¦ 08/07/2016 11:00 ¦
¦ 09/07/2016 10:00 ¦ 09/07/2016 10:30 ¦ 08/07/2016 11:00 ¦
¦ 09/07/2016 10:30 ¦ 09/07/2016 12:00 ¦ 08/07/2016 12:00 ¦
+--------------------------------------------------------+
只是为了说明这一点 - 我不需要分区,我只希望它能在我的数据上工作一天。
但是 windowing 子句似乎因为日期数据类型而表现不同。我不想要那样 - 我只是希望它根据排序在实际的前一行上工作,而不是在 (date - 1)
上工作。是因为这是约会吗,我该如何处理?
如果您正在使用 ORDER BY start_dt asc range BETWEEN UNBOUNDED PRECEDING 1 PRECEDING
Oracle 计算当前行的逻辑偏移量。
例子。
对于示例的第一行,范围是 08/07/2016 09:00
和 07/07/2016 09:00
因为 (start_dt - 1) = 08/07/2016 09:00 -1
= 07/07/2016 09:00
。
.
将范围更改为行