【发布时间】:2021-10-18 19:43:48
【问题描述】:
我有一些每 5 分钟生成行的 SQL。如何修改它以消除重叠时间(见下文)
注意:每一行都应该与一个 location_id 相关联,并且在 location_id 上没有重复。在这种情况下,应该生成 25 行,因此 CONNECT by 应该类似于 SELECT count(*) from locations。
我的目标是创建一个函数,该函数接受 schedule_id 和 start_date 的格式 'MMDDYYYY HH24:MI';如果下一个条目将超过午夜,则停止创建行;这意味着某些 location_id 可能不会被使用。
最终结果是将行放置在下面的计划表中。由于我还没有函数,所以可以将 schedule_id 硬编码为 1。我听说过递归 CTE,这种方法是否具有这种质量?
在此先感谢所有回答的人和您的专业知识。
ALTER SESSION SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS';
create table schedule(
schedule_id NUMBER(4),
location_id number(4),
start_date DATE,
end_date DATE,
CONSTRAINT start_min check (start_date=trunc(start_date,'MI')),
CONSTRAINT end_min check (end_date=trunc(end_date,'MI')),
CONSTRAINT end_gt_start CHECK (end_date >= start_date),
CONSTRAINT same_day CHECK (TRUNC(end_date) = TRUNC(start_date))
);
CREATE TABLE locations AS
SELECT level AS location_id,
'Door ' || level AS location_name,
CASE. round(dbms_random.value(1,3))
WHEN 1 THEN 'A'
WHEN 2 THEN 'T'
WHEN 3 THEN 'G'
END AS location_type
FROM dual
CONNECT BY level <= 25;
with
row_every_5_mins as
( select trunc(sysdate) + (rownum-1)*5/1440 t_from,
trunc(sysdate) + rownum*5/1440 t_to
from dual
connect by level <= 1440/5
) SELECT * from row_every_5_mins;
Current output:
|T_FROM|T_TO|
|-----------------|-----------------|
|08162021 00:00:00|08162021 00:05:00|
|08162021 00:05:00|08162021 00:10:00|
|08162021 00:10:00|08162021 00:15:00|
|08162021 00:15:00|08162021 00:20:00|
…
期望的输出
|T_FROM|T_TO|
|-----------------|-----------------|
|08162021 00:00:00|08162021 00:05:00|
|08162021 00:10:00|08162021 00:15:00|
|08162021 00:20:00|08162021 00:25:00|
…
【问题讨论】:
-
所以要“消费”
location_id,应该有一些您希望将生成的行分配给位置的顺序。schedule_id是否与位置有任何关联,或者它们应该以相同的方式用于任何schedule_id?