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

時間に基づいて2つのテーブルをマージします

    私はあなたの質問をある種のギャップと島の問題として理解しています。

    unionで解決します 両方のテーブルを作成し、ウィンドウの合計を実行してグループを識別します。ログインが満たされるたびに、新しいグループが開始されます。最後のステップは、グループごとに集計することです。

    select
        id,
        min(case when action = 'in'  then dt end) login_time,
        max(case when action = 'out' then dt end) logout_time
    from (
        select
            t.*,
            sum(case when action = 'in' then 1 else 0 end)
                over(partition by id order by dt) grp
        from (
            select id, login_time dt, 'in' action from login
            union all select id, logout_time, 'out' from logout
        ) t
    ) t
    group by id, grp
    order by id, grp
    

    DBフィドルのデモ

    ID | LOGIN_TIME                      | LOGOUT_TIME                    
    -: | :------------------------------ | :------------------------------
     1 | 19-DEC-19 03.59.33.637000000 AM | 19-DEC-19 04.34.22.535000000 AM
     2 | 19-DEC-19 06.58.16.318000000 AM | 19-DEC-19 07.52.21.568000000 AM
     2 | 19-DEC-19 10.19.26.039000000 AM | null                          
     2 | 19-DEC-19 10.26.03.411000000 AM | null                          
     2 | 19-DEC-19 01.35.56.006000000 PM | 19-DEC-19 02.06.13.585000000 PM
    


    1. 同じ列値を持つmysqlテーブルから特定の行を削除するにはどうすればよいですか?

    2. mysqli_stmt ::bind_param()-各パラメーターにs以外の別のデータ型を指定します

    3. WhoIsActiveランナー

    4. 1つのフィールドをCLOBとして使用するOracle挿入スクリプトを作成するにはどうすればよいですか?