Sql 统计过去5分钟内特定日期、特定商店、特定终端在过去5分钟内的交易数量

Sql 统计过去5分钟内特定日期、特定商店、特定终端在过去5分钟内的交易数量,sql,sas,Sql,Sas,我正在尝试计算当前事务在过去5分钟内发生的事务数 CALL_DAY TRANS_TIME STORE_NUM TERMINAL CUSTOMER_NUMBER 20130201 10:46:04 1111 1 1 20130202 17:09:19 1111 2 2 20130202 17:10:30 2222

我正在尝试计算当前事务在过去5分钟内发生的事务数

CALL_DAY    TRANS_TIME  STORE_NUM   TERMINAL    CUSTOMER_NUMBER
20130201    10:46:04    1111               1                  1
20130202    17:09:19    1111               2                  2
20130202    17:10:30    2222               3                  3
20130202    17:11:35    2222               3                  3
20130202    17:13:26    2222               3                  4
以上是发生的所有单独交易。我试图找出在过去5分钟内,在特定的一天、特定的门店号、特定的终端发生了多少笔交易,并为每一行创建一列,说明每笔交易的编号

CALL_DAY    TRANS_TIME  STORE_NUM   TERMINAL    CUSTOMER_NUMBER
20130201    10:46:04    1111               1                  1
20130202    17:09:19    1111               2                  2
20130202    17:10:30    2222               3                  3
20130202    17:11:35    2222               3                  3
20130202    17:13:26    2222               3                  4
到目前为止,我已经将日期和时间转换为如下所示的datetime函数。然后,我尝试使用DATEADD函数,但这并没有实现我试图找到的结果。有人知道如何做到这一点吗

/* Converting to DATETIME */
Data NEW_FILE ; 
SET DATA.MY_FILE; 
new_call_day = input(compress(call_day),yymmdd8.);  
format new_call_day date9.;                         
new_time = input(compress(trans_time), HHMMSS8.);   
format new_time HHMM5.;                            
dtetime  = dhms(compress(new_call_day),0,0,compress(new_time)); 
format dtetime datetime22.                                
RUN;
在此之后,我尝试了DATEADD,但它没有为我想要的每一个创建一列。我被卡住了。。。也许我走错路了?

TL;博士 使用SQL子查询。它们速度很快,特别是如果您可以将执行传递给DBMS并且易于维护的话

PROC-SQL-NOPRINT; 创建表格Work.TransWithCount AS 选择STORE_NUM 航空站 ,TRANS_DT , 选择计数* 从工作中。转换为T 其中T.STORE\u NUM=P.STORE\u NUM T终端=P终端 和T.TRANS_DT>=P.START_DT T.TRANS_DT=P.START_DT
我不知道你说的“试过约会”是什么意思。这不是SAS函数…您正在查看多少数据?这是数百万行吗?数十亿?这将有助于查看一些示例输出数据…您希望如何处理上述示例输入数据DateAdd是一个SQL SERVER函数,SAS中的等效函数是INTCK。我正在处理大约10万行。抱歉,我不准确,我尝试使用DATEADD bc SAS,也可以使用SQL。
DATA Work.Trans2;

    FORMAT  STORE_NUM       4.0
            TERMINAL        1.0
            TRANS_DT        DATETIME18.
            TRANS_COUNT     6.0
            ;

    KEEP    STORE_NUM
            TERMINAL
            TRANS_DT
            TRANS_COUNT
            ;

    /* OPEN THE Work.Trans DATASET */
    TransId = OPEN( 'Work.Trans', 'IN' );

    /* ITERATE OVER ALL OBSERVATIONS IN Work.Trans */
    CURR_OBS = 1;
    DO WHILE(1);
        PUT 'CURR_OBS = ' CURR_OBS;
        /* LOAD NEXT OBSERVATION */
        NEXT_RC = FETCHOBS( TransId, CURR_OBS );
        IF (NEXT_RC ~= 0) THEN LEAVE;

        /* LOAD VALUES FROM THE CURRENT OBSERVATION */
        STORE_NUM = GETVARN( TransId, 1 );
        TERMINAL = GETVARN( TransId, 2 );
        CUSTOMER_NUMBER = GETVARN( TransId, 3 );
        TRANS_DT = GETVARN( TransId, 4 );
        START_DT = GETVARN( TransId, 5 );
        END_DT = GETVARN( TransId, 6 );
        TRANS_COUNT = 0;

        /* PEEK AHEAD TO COUNT TRANSACTIONS THAT OCCURRED WITHIN THE SPECIFIED
           TIME RANGE */
        PEEK_OBS = CURR_OBS + 1;
        DO WHILE(1);
            PUT 'PEEK_OBS = ' PEEK_OBS;
            /* PEEK AHEAD TO NEXT OBSERVATION */
            PEEK_RC = FETCHOBS( TransId, PEEK_OBS );
            /* IF THE EOF IS REACHED, EXIT THE CURRENT DO LOOP
               (STOP PEEKING) */
            IF ( PEEK_RC ~= 0 ) THEN LEAVE;

            PK_STORE_NUM = GETVARN( TransId, 1 );
            PK_TERMINAL = GETVARN( TransId, 2 );
            PK_TRANS_DT = GETVARN( TransId, 4 );

            IF PK_STORE_NUM = STORE_NUM AND 
               PK_TERMINAL = TERMINAL AND 
               PK_TRANS_DT >= START_DT AND
               PK_TRANS_DT <= END_DT
            THEN DO;
                /* IF THE STORE_NUM AND TERMINAL MATCH THE CURRENT OBSERVATION 
                   AND THE TRANS_DT IS WITHIN THE ACCEPTABLE RANGE THEN
                   INCREMENT TRANS_COUNT BY 1 */
                TRANS_COUNT + 1;
            END;
                /* OTHERWISE, EXIT THE CURRENT DO LOOP (STOP PEEKING AHEAD) */
                ELSE LEAVE;

            /* INCREMENT PEEK INDEX BY 1 */
            PEEK_OBS + 1;
        END;

        /* OUTPUT THE CURRENT RECORD ALONG WITH THE TRANS_COUNT TO
           Work.Trans2 */
        OUTPUT;

        /* INCREMENT CURRENT OBSERVATION INDEX BY 1 */
        CURR_OBS + 1;
    END;

    /* EXPLICITLY CLOSING THE Work.Trans DATASET IS OPTIONAL IN THIS CONTEXT,
       BUT GOOD PRACTICE */
    CLOSE_RC = CLOSE( TransId );
RUN;
PROC SORT DATA=Work.Trans2;
    BY      STORE_NUM
            TERMINAL
            TRANS_DT
            ;
RUN;