sql階層語句或自循環

如: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 /*差集小於十分鐘*/
結果如圖:

相關文章
相關標籤/搜索