Sql 统计过去5分钟内特定日期、特定商店、特定终端在过去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
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;