如:html
有一個交易信息表,該表有:交易日期(年月日),交易時間(時分秒),櫃員編號,網點號,操做員id等。測試期間,沒有建主鍵。java
查詢:同一天,在同一個網點上,一個操做員,給三個以上的用戶進行查詢或轉帳,十分鐘以內的記錄。
算法
解答:這查詢條件看起來其實不難,可是裏面涉及階層,或者說嵌套查詢。測試
剛開始用start with ... connect by (具體用法,本身百度吧),比較複雜。spa
我用了一個臨時表的方式。.net
以下:htm
第一步:blog
建表:get
create table JIAOYI_TABLE
(
T_DATE VARCHAR2(10),--日期
T_TIME VARCHAR2(20),--時間
WANGDIAN VARCHAR2(50),--網點
CAOZUOYUAN VARCHAR2(50) --操做員
);it
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '092908', '11', '111');
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '093021', '11', '111');
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '093209', '11', '111');
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '100907', '11', '111');
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '110909', '22', '222');
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '110924', '22', '222');
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '111208', '22', '222');
insert into JIAOYI_TABLE (T_DATE, T_TIME, WANGDIAN, CAOZUOYUAN)
values ('2015-10-14', '112123', '22', '222');
第二步:
查詢結果存入臨時表1中
CREATE TABLE tmp_001 AS
SELECT T1.T_DATE,
T1.WANGDIAN,
T1.CAOZUOYUAN,
T1.T_TIME,
ROW_NUMBER() OVER(PARTITION BY T1.T_DATE, T1.WANGDIAN, T1.CAOZUOYUAN ORDER BY T1.T_TIME) AS RN
FROM JIAOYI_TABLE T1,
(SELECT T.T_DATE, T.WANGDIAN, T.CAOZUOYUAN
FROM JIAOYI_TABLE T
GROUP BY T.T_DATE, T.WANGDIAN, T.CAOZUOYUAN) T2
WHERE T1.T_DATE = T2.T_DATE
AND T1.WANGDIAN = T2.WANGDIAN
AND T1.CAOZUOYUAN = T2.CAOZUOYUAN
第三步:
自關聯,經過rn字段階層相減時間字段值(轉換成分鐘),獲得結果
時分秒字段值轉換分鐘的算法(目前我用最笨的,會公式的求指點一下,謝謝):時*60+分+秒/60 = 分鐘;
SELECT T1.T_TIME,
T2.T_TIME,
(TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 1, 2)) * 60 + TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 3, 2)) +
ROUND(TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 5, 2)) / 60, 1)) A,
(TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 1, 2)) * 60 + TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 3, 2)) +
ROUND(TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 5, 2)) / 60, 1)) B,
(TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 1, 2)) * 60 + TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 3, 2)) +
ROUND(TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 5, 2)) / 60, 1)) -
(TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 1, 2)) * 60 + TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 3, 2)) +
ROUND(TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 5, 2)) / 60, 1)) CHAJI
/*第二個階層:時*60+分+秒/60 - 第一個階層:時*60+分+秒/60 */
FROM TMP_001 T1, TMP_001 T2
WHERE T1.T_DATE || T1.WANGDIAN || T1.CAOZUOYUAN =
T2.T_DATE || T2.WANGDIAN || T2.CAOZUOYUAN
AND T1.RN - 1 = T2.RN
AND (TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 1, 2)) * 60 + TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 3, 2)) +
ROUND(TO_NUMBER(SUBSTR(LPAD(T1.T_TIME, 6, '0'), 5, 2)) / 60, 1)) -
(TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 1, 2)) * 60 +TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 3, 2)) +
ROUND(TO_NUMBER(SUBSTR(LPAD(T2.T_TIME, 6, '0'), 5, 2)) / 60, 1)) < 10 /*差集小於十分鐘*/
結果如圖: