[SQL Runday] HackerRank - SQL Project Planning


プロジェクトタスクのID、開始日、終了日を含むテーブルがあります.開始日と終了日は行ごとに1日違います.
  • タスクの終了日が連続している場合は、同じ項目です.
  • すべて他の項目の総数を求める.
  • プロジェクトの開始日と終了日のクエリーを書きます.
  • の所要時間を昇順に並べ替え、値が同じ場合は開始日に並べ替え
  • .

    Table



    Key points


    問題の解き方
    1.start dateコラムでプロジェクトの開始日を探します.start dateデータのend dateコラムに値がない場合は、それらです.
    2.end dateコラムでプロジェクトの終了日を探します.end dateデータでは、start dateコラムに値がない場合は、それらです.
    3.開始日のみのテーブルと終了日のみのテーブルを1:1で接続します.(ここで結構時間がかかりました…)
    4.最後に、duration変数を作成してプロジェクトdurationでソートします.

    Errors

  • 上のフローでは、各テーブルは容易に入手できますが、追加方法では苦労します.joinを必要とする外部キーがなければmysqlは直接joinできないからです.△調べてみると、oracleはfetchfirst 1 rowsonlyとかでやっています.オンなしで入れますが、そうすると1:1対応がダメで1:Nに増えます.
  • そこで
  • は各テーブルに外来鍵を作る方法で行うことにした.project_idという名前のインデックスが作成され、2つのテーブルが接続されます.
  • -- 나는 변수를 3개 썼는데, 더 좋은 방법이 있을 거 같다.
    set @project_id = 0;
    set @project_idx = 0;
    set @duration = 0;
    select p.start_date, m.end_date
    from (select end_date, @project_id:= @project_id+1 as pro_index 
          from projects
          where end_date not in (select start_date from projects))as m
    join (select start_date, @project_idx:= @project_idx+1 as pro_idx 
          from projects 
          where start_date not in (select end_date from projects))as p
    on m.pro_index = p.pro_idx
    order by @duration:= m.end_date - p.start_date
  • 最後に、duration変数をどこで作成すればいいか考えていましたが、order byの後ろに直接置いて解決しました.常にpythonや既存の変数で考えるには、時間がかかるようです.sqlにはsql独自の方法があります...