2017-12-10 10 views
0

ユーザーの取引の一覧があります。各ユーザーには複数のトランザクションがあります。私は次のコードを書いて、ユーザーの最新のトランザクションを見つけて、過去7日間以上のトランザクションを持っていないユーザーを選びましたが、自分のコードの時間的複雑さが何であるか分かりません。誰かが私のコードの時間的複雑さをどのように練習することができるのか説明できますか?次のSQLコードの時間の複雑さを解決するにはどうすればよいですか?

trans_dateは取引日です。ここで

select user_id,_date,datediff(curdate(),_date) 
from(
     select t1.send_id as user_id,from_unixtime(t1.trans_date) as _date 
     from transactionhistory as t1 
     where from_unixtime(t1.trans_date) = 
        (select max(from_unixtime(t2.trans_date))  
        from transactionhistory as t2 
        where t2.send_id = t1.send_id)) as tab   
where datediff(curdate(),_date) > 7; 

EXPLAINコマンドの出力

see image here

+0

最初のステップは、システムにクエリの実行計画を説明することです。あなたはどのような環境で走っていますか? Hadoopの場合は、EXPLAIN コマンドを使用し、質問に出力を追加します。 – Richard

+0

@リチャード質問にEXPLAIN コマンドの出力を追加しました。それは、SQLサーバー環境です。あなたは今、時間の複雑さを練習するのを助けることができますか? – Behroz

答えて

0

は正しいクエリですか?

ユーザごとに処理するために、最も内側のクエリはfrom ... t2 where t2.send_id = t1.send_idである必要があります。そうでない場合は、最新のトランザクション全体を持つ1人のユーザーの最新レコードを選択するだけです。

O(n^2)だと思います。外部O(n)ループと内部O(n)ループ。

+0

あなたは正しいです!私は間違って質問の詳細を編集している間にその行を削除した。私はそれを今戻しました。 – Behroz

関連する問題