我正在尝试生成一系列从随机起点到随机(更大(终点的整数。此外,我想把它作为一个窗口函数,这样我就可以在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
值的表(正在为每一行复制。
这是一个理想的结果:
客户端 | |
---|---|
1 | 4 |
1 | 5 |
1 | 6 |
1 | 7 |
2 | 14 |
2 | 15 |
3 | 13 |
3 | 14 |
3 | 15 |
3 | 16 |
3 | 17 |
3 | 18 |
3 | 19 |
3 | 20 |
3 | 21 |
在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 | |
---|---|
1 | 7 |
1 | 8 |
1 | 9 |
1 | 10 |
2 | 19 |
2 | 20 |
2 | 21 |
2 | 22 |
2 | 23 |
2 | 24 |
3 | 6 |
3 | 7 |
3 | 8 |
3 | 9 |
3 | 10 |
3 | 11 |
3 | 12 |
3 | 13 |
3 | 14 |
3 | 15 |
3 | 16 |