sql >> データベース >  >> RDS >> Mysql

従業員のスワイプインとスワイプアウトの時差。テールゲーティングを可能にし、別の日に終了します

    友人の助けを借りて、ポイント#2で述べた問題を解決しました :以下の手順で、SQLスクリプトでのみソリューションが必要だったので、SQLの知識がほとんどなく、3つのステップでソリューションを設計したので、専門家がより簡単に処理できると確信しています:

    ベーステーブルをEMP_DATAと見なして、1つの一時テーブルを使用しました。Temp_1ベーステーブルには、最後のステップでレコードにフラグを立てるために「VALIDITY」フィールドを追加しました。

    EMP_DATA:

    EMPID EVENT_TYPE Swipe_time       VALIDITY
    1     EN1        2012-06-01 12:00
    1     EX         2012-06-01 12:30
    2     EN1        2012-06-01 12:50
    1     EN2        2012-06-01 13:10
    1     EN2        2012-06-01 15:50
    2     EX         2012-06-01 13:30
    2     EN1        2012-06-01 14:00
    2     EX         2012-06-02 19:00
    1     EX         2012-06-02 19:30
    

    ステップ1:

    以下のクエリは、EMP_DATAの行に行番号を割り当て、それらをtemp_1テーブルにコピーします。

    create table Temp_1 (EMP_ID int, Event_Type char(10), Swipe_Time datetime, rownum int, Lastevent char(10), Nextevent char(10)) 
    
    Insert into  Temp_1             
    SELECT  EMP_ID, EVENT_TYPE,
    ROW_NUMBER() OVER ( PARTITION BY EMP_ID 
    ORDER BY SWIPE_TIME ) AS RowNumber      
        FROM EMP_DATA
    

    ステップ1の出力:

     EMPID EVENT_TYPE Swipe_time         RowNumber  LastEvent  NextEvent
    1     EN1        2012-06-01 12:00    1
    1     EX         2012-06-01 12:30    2
    2     EN1        2012-06-01 12:50    1
    1     EN2        2012-06-01 13:10    3
    1     EN2        2012-06-01 15:50    4
    2     EX         2012-06-01 13:30    2
    2     EN1        2012-06-01 14:00    3
    2     EX         2012-06-02 19:00    4
    1     EX         2012-06-02 19:30    5
    

    ステップ2:

    temp_1テーブルの行の各イベントの最後のイベント(前のイベント)と次のイベントを識別します

     Update  main set main.LastEvent =yy.LEvent,main.NextEvent=yy.NEvent
     from TEMP_1 main
     inner join
     ( SELECT   A.EMP_ID , A.EVENT_TYPE, A.SWIPE_TIME, A.ROWNUMBER                                                                                                                                                                                                                                                          
                   COALESCE(LastVal.ZONE_NAME, 'N/A') AS LEvent ,                                                                                                                                                                                                                                                               
                       COALESCE(NextVal1.ZONE_NAME, 'N/A') AS NEvent                                                                                                                                                                                                                                                       
              FROM Temp_1  A                                                                                                                                                                                                                                                               
                   LEFT JOIN Temp_1 LastVal                                                                                                                                                                                                                                                        
                      ON A.EMP_ID= LastVal.EMP_ID
                         AND A.ROWNUMBER - 1 = LastVal.ROWNUMBER                                                                                                                                                                                                                                                   
                   LEFT JOIN Temp_1 NextVal1                                                                                                                                                                                                                                                    
                      ON A.EMP_ID= NextVal1.EMP_ID
                         AND A.ROWNUMBER + 1 = NextVal1.ROWNUMBER)yy                                       
    on main.EMP_ID=yy.EMP_ID,
    and main.event_type=yy.event_type
    and main.swipe_time = yy.swipe_event
    

    ステップ2の出力:

    EMPID EVENT_TYPE Swipe_time         RowNumber  LastEvent  NextEvent
    1     EN1        2012-06-01 12:00    1           N/A        EX
    1     EX         2012-06-01 12:30    2           EN1        EN2
    2     EN1        2012-06-01 12:50    1           N/A        EX
    1     EN2        2012-06-01 13:10    3           EX         EN2
    1     EN2        2012-06-01 15:50    4           EN2        EX
    2     EX         2012-06-01 13:30    2           EN1        EN1
    2     EN1        2012-06-01 14:00    3           EX         EX
    2     EX         2012-06-02 19:00    4           EN1        N/A
    1     EX         2012-06-02 19:30    5           EN2        N/A
    

    ステップ3:

    LastEventとNextEventに基づいて、テールゲートされたエントリを識別し、以下のクエリによってメインテーブルEMP_DATAを更新できます:

     Update emp set emp.VALIDITY='N'
    from EMP_DATA
    INNER JOIN
    (select *
    from TEMP_1
    where (EVENT_TYPE = 'EX' and LastEvent = 'EX') 
    or (EVENT_TYPE IN ('EN1','EN2') and NextEvent  IN ('EN1','EN2')))yy
    ON emp.EMP_ID = yy.EMP_ID
    and emp.EVENT_TYPE = yy.EMP_ID
    and emp.Swipe_time = yy.Swipe_time
    

    最終出力: * ステップ3の出力: *

    EMPID EVENT_TYPE Swipe_time       VALIDITY
    1     EN1        2012-06-01 12:00
    1     EX         2012-06-01 12:30
    2     EN1        2012-06-01 12:50
    1     EN2        2012-06-01 13:10    N
    1     EN2        2012-06-01 15:50    
    2     EX         2012-06-01 13:30
    2     EN1        2012-06-01 14:00
    2     EX         2012-06-02 19:00
    1     EX         2012-06-02 19:30
    



    1. JPASETIDENTITY_INSERTが機能しない

    2. 列の値に基づいて列を動的に選択する

    3. 大文字と小文字を区別するようにMysqlテーブルの列を変更する

    4. 最も類似した数値行を見つけるためのMySQLクエリ