按时间分组

时间:2018-03-16 09:15:58

标签: sql oracle

Aloha大家,我一直在搜索有关groupoveflow的所有问题,没有人问我需要什么。这是我的疑问。 我有这张桌子:

image

我有很多来自同一个人的请求(ID_SOL)(ID_PERSONA)。每个人都在不同的时间制作。我希望在15分钟的时间内将它们分组。

例如:第一行的时间是上午7:23:35,这将是所有请求的组,直到上午7:38:35。然后在7:39:36 AM之后的下一个请求应该以7:39:36 AM - 7:54:36 AM的时间间隔开始一个新组。

在图像2中,您可以看到我的预期结果:

image

我使用此查询:

SELECT 
    ID_CREACION, 
    ID_PERSONA,
    ID_MOTIVO,
    ID_FEC_CREACION, 
    ID_FEC_CREACION+(1/1440*15) ID_FEC_MAX,
    ID_NUM_SOL,
    ID_SOL,
    FIRST_VALUE(ID_SOL) OVER (PARTITION BY ID_CREACION,ID_PERSONA
            ORDER BY ID_FEC_CREACION RANGE BETWEEN INTERVAL '15' MINUTE PRECEDING AND CURRENT ROW) ID_SOL_P,
    ROW_NUMBER() OVER (PARTITION BY ID_CREACION, ID_CLIENTE, ID_FEC_CREACION, ID_FEC_CREACION+(1/1440*15) ORDER BY ID_FEC_CREACION) ID_FILA
FROM 
    VITAR_AGUS_SOL

但我得到了这个:

image

在完成第一个小组后,我无法开始新的小组。我在SQL中可以做什么?谢谢您的回答。

1 个答案:

答案 0 :(得分:0)

有点困惑),但也许有用:

select ID_CREACION, ID_PERSONA, ID_FEC_CREACION, ID_SOL, ID_SOL_P 
from VITAR_AGUS_SOL
model dimension by ( 
    ID_CREACION, 
    ID_PERSONA, 
    row_number() OVER ( PARTITION BY ID_CREACION, ID_PERSONA 
                        ORDER BY ID_FEC_CREACION ) ord )
MEASURES ( ID_FEC_CREACION, ID_SOL, 0 min_dt, 0 ID_SOL_P )
rules(
    min_dt[ ID_CREACION, ID_PERSONA, ord > 0 ] order by ID_CREACION, ID_PERSONA, ord =
        case 
            when ID_FEC_CREACION[ cv( ID_CREACION ), cv( ID_PERSONA ), cv( ord ) ] 
                    - ID_FEC_CREACION[ cv( ID_CREACION ), cv( ID_PERSONA ), 
                    min_dt[ cv( ID_CREACION ), cv( ID_PERSONA ), cv( ord ) - 1 ] ] < 15/1440 
                then min_dt[ cv( ID_CREACION ), cv( ID_PERSONA ), cv( ord ) - 1 ] 
            else cv( ord ) 
        end,
    ID_SOL_P[ ID_CREACION, ID_PERSONA, ord ] = ID_SOL[ cv( ID_CREACION ), 
                    cv( ID_PERSONA ), 
                    min_dt[ cv( ID_CREACION ), 
                    cv( ID_PERSONA ), cv( ord ) ] ]
)