2016-07-01 10 views
0

私はsqlite3をpythonで使用してというフィールドの"Title,Date,Author"というsqliteテーブルからデータを取得しています。著者の名前は私が'foo'ない次の最古の著者を選択したいと思います。その場合には'foo'、しかしでない限り、それぞれのユニークなタイトル(グループ)については、私は、その日付の最小DateAuthorを選択します最も早い日付を保持してください。すべての作者が'foo'なら、その場合は問題ありません。Python sqlite3例外を持つグループから最小値を選択する

私の以前のクエリは、'foo'であるかどうかにかかわらず、最小日付の著者を選んだだけなので、最後の仕様を満たさない"SELECT Title,min(Date),Author FROM Documents GROUP BY Title"でした。

私はcreate_aggregateで集約関数を作成し、'foo'をフィルターに掛けることを考えていましたが、私は次の最も早い著者を確実に得る方法がわかりません。サブクエリやCASE式ではもっと簡単になるかもしれませんが、私はあまりよく分かりません。

これはどのように達成できますか?あなたが仕事をするために2つのクエリとPythonを使ってもかまわない場合

答えて

2

、これは期待どおりに動作します:

# first query to get the min date of each "Title" 
query = "SELECT Title, MIN(Date) FROM Documents GROUP BY Title" 
min_date_by_title = cursor.fetchall(query) 

# then get the author for each "Title", except if it's "foo" 
query = "SELECT Title, Author FROM Documents WHERE Author != 'foo' ORDER BY Date GROUP BY Title" 
author_by_title = cusor.fetchall(query) 

# last step: match entries one by one of the two previous results 
final_result = [] 
for title1, date in min_date_by_title: 
    for title2, author in author_by_title: 
     if title1 == title2: # same title 
      final_result.append([title1, date, author]) 
      break 
    else: # if we didn't find any match, it means that the only author for this title was 'foo' 
     final_result.append([title1, date, 'foo']) 

性能が避けるために(キーは異なるタイトルである)辞書を使用することによって改善することができます内側のループ

+0

返信いただきありがとうございます。 Pythonでは、min_date_by_titleと 'SELECT Author、min(Date)WHERE Title = [現在のタイトル]とAuthor!= 'foo''を繰り返し実行するforループを1つ実行して、著者はそれが何も得られない場合、より高速かもしれません。私はそれが時間を節約し、パフォーマンスを向上させる傾向があるが、sqliteクエリで直接行う方法があるかどうかは不思議でした。 – dieggsy

+0

@therockmandolinist私は、内側のループを暗示していても、フェッチするタイトルの数が何であれ2つのクエリだけを実行するよりも、各タイトルのクエリを実行する方がより多くの消費量を要すると確信しています。ただし、単一の問合せ内で実行する方法はいくつかありますが、これはおそらく複雑な問合せにつながりますが、これはコードの保守性には適していません。非常に大量のデータの場合は – julienc

+0

ですが、外部ループの不要な項目をループしなければならないというわけではありませんか?私が見たことから、クエリを実行することは本当に速くなる可能性があるので、内部ループespよりも速いと思っていました。より多くのタイトルで - しかし、私の経験は非常に限られているので、正しいかもしれません。複雑なクエリについては同意しますが、パフォーマンス面ではおそらくそれが望ましいと思われます。 – dieggsy

関連する問題