[SQL Runday] HackerRank - SQL Project Planning
4118 ワード
プロジェクトタスクのID、開始日、終了日を含むテーブルがあります.開始日と終了日は行ごとに1日違います.タスクの終了日が連続している場合は、同じ項目です. すべて他の項目の総数を求める. プロジェクトの開始日と終了日のクエリーを書きます. の所要時間を昇順に並べ替え、値が同じ場合は開始日に並べ替え .
問題の解き方
1.start dateコラムでプロジェクトの開始日を探します.start dateデータのend dateコラムに値がない場合は、それらです.
2.end dateコラムでプロジェクトの終了日を探します.end dateデータでは、start dateコラムに値がない場合は、それらです.
3.開始日のみのテーブルと終了日のみのテーブルを1:1で接続します.(ここで結構時間がかかりました…)
4.最後に、duration変数を作成してプロジェクトdurationでソートします.
上のフローでは、各テーブルは容易に入手できますが、追加方法では苦労します.joinを必要とする外部キーがなければmysqlは直接joinできないからです.△調べてみると、oracleはfetchfirst 1 rowsonlyとかでやっています.オンなしで入れますが、そうすると1:1対応がダメで1:Nに増えます. そこでは各テーブルに外来鍵を作る方法で行うことにした. 最後に、duration変数をどこで作成すればいいか考えていましたが、order byの後ろに直接置いて解決しました.常にpythonや既存の変数で考えるには、時間がかかるようです.sqlにはsql独自の方法があります...
Table
Key points
問題の解き方
1.start dateコラムでプロジェクトの開始日を探します.start dateデータのend dateコラムに値がない場合は、それらです.
2.end dateコラムでプロジェクトの終了日を探します.end dateデータでは、start dateコラムに値がない場合は、それらです.
3.開始日のみのテーブルと終了日のみのテーブルを1:1で接続します.(ここで結構時間がかかりました…)
4.最後に、duration変数を作成してプロジェクトdurationでソートします.
Errors
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
Reference
この問題について([SQL Runday] HackerRank - SQL Project Planning), 我々は、より多くの情報をここで見つけました https://velog.io/@honeybeat1/SQL-Runday-HackerRank-SQL-Project-Planningテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol