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

2 つのテーブルをマージして、重複する日付とギャップを見つける

    分析 lead() を使用したこのクエリ 仕事をします。列 note 行がデータに由来するかどうか、またはギャップが欠落しているかどうかを示します:

    select id, d1, d2, case dir when 3 then 'GAP' end note 
      from (
        select id, 
               case when dir = 2 
                     and lead(dir) over (partition by id order by dt) = 1
                     and lead(dt) over (partition by id order by dt) <> dt + 1
                    then dt + 1 
                    else dt
               end d1,
               case when dir = 2 
                     and lead(dir) over (partition by id order by dt) = 1
                     and lead(dt) over (partition by id order by dt) <> dt + 1
                    then 3 
                    else dir
               end dir,
               case when lead(dir) over (partition by id order by dt) = 1 
                    then lead(dt)  over (partition by id order by dt) - 1
                    else lead(dt)  over (partition by id order by dt) 
                end d2
          from (
            select * from a unpivot (dt for dir in (validfrom as 1, validto as 2)) union 
            select * from b unpivot (dt for dir in (validfrom as 1, validto as 2)) ) )
      where dir in (1, 3)
      

    最初は、すべての日付を 1 つの列に表示するためだけにデータのピボットが解除され、その後の分析が容易になります。 Union は、重複した値を削除します。列 dir これが from かどうかを通知します または to 日にち。次にlead この方向のタイプに応じて、ロジックが適用されます。いくらか単純化できると思います:)




    1. SQLiteリクエストのstrftimeをMySQLに変換します

    2. PostgreSQL 9.3:2つの列を1つに統合

    3. MySQLデータベース開発のためのGearHost入門

    4. すべてのUTF8文字を最も標準的な形式に正規化する