使用随机起始和结束SQL Oracle生成一系列整数



我正在尝试生成一系列从随机起点到随机(更大(终点的整数。此外,我想把它作为一个窗口函数,这样我就可以在OVER (PARTITION BY )语句中使用它。

基本上,我试图选择随机的时间(从1-24(,但以随机的方式,也可以连续地,并为每个客户这样做(这就是为什么我建议使用OVER (PARTITION BY client)语句,但我对其他想法持开放态度。

我正在尝试使用:

SELECT
T1.HOURS
FROM (
SELECT
LEVEL HOURS
FROM DUAL
CONNECT BY
LEVEL <= 24
) T1,
(
SELECT
INIT,
LEAST(INIT + LENGTH, 24) FIN
FROM (
SELECT
ROUND(DBMS_RANDOM.VALUE(1, 24)) INIT,
ROUND(DBMS_RANDOM.VALUE(1, 24)) LENGTH
FROM DUAL
) T0
) T2
WHERE
T1.HOURS >= T2.INIT AND
T1.HOURS <= T2.FIN;

但不幸的是,结果是非连续订单。|小时||-----||17||18||20||24 |

该代码既不简单也不起作用,因为表T0(它是过滤初始INIT和最终FIN值的表(正在为每一行复制。

这是一个理想的结果:

小时
客户端
14
15
16
17
214
215
313
314
315
316
317
318
319
320
321

在Oracle中,您可以使用相关的LATERAL联接:

SELECT c.id,
h.hours
FROM   ( SELECT id,
FLOOR(DBMS_RANDOM.VALUE(1, 25)) AS bound1,
FLOOR(DBMS_RANDOM.VALUE(1, 25)) AS bound2
FROM   clients
) c
CROSS JOIN LATERAL (
SELECT LEAST(bound1, bound2) + LEVEL - 1 AS hours
FROM   DUAL
CONNECT BY LEVEL <= ABS(bound1 - bound2) + 1
) h;

然后,对于样本数据:

CREATE TABLE clients (id) AS
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 3;

五月(随机(输出:

ID
17
18
19
110
219
220
221
222
223
224
36
37
38
39
310
311
312
313
314
315
316

最新更新