2016-03-21 11 views
2

をいくつかの「重複」を削除します。、私はモデルのためのいくつかの結果を含むDjangoのクエリセット持っているDjangoのクエリセットから

class MyModel(models.Model): 
    value = models.FloatField() 
    date_seen = models.DateTimeField() 

今すぐクエリセットは、時間をかけて制限され、重複した結果が含まれています

MyModel.date_seen - MyModel.value 
2016-03-01 10:00:00 - 124 
2016-03-01 11:00:00 - 124 
2016-03-01 12:00:00 - 99 
2016-03-01 13:00:00 - 99 
2016-03-01 14:00:00 - 99 
2016-03-01 15:00:00 - 103 
2016-03-01 16:00:00 - 103 
2016-03-01 17:00:00 - 176 
2016-03-01 18:00:00 - 12 
2016-03-01 19:00:00 - 12 

今私が持っていたいのは、値が変更された結果のみを含むQuerySetだけです。結果は次のようになります:

MyModel.date_seen - MyModel.value 
2016-03-01 10:00:00 - 124 
2016-03-01 12:00:00 - 99 
2016-03-01 15:00:00 - 103 
2016-03-01 17:00:00 - 176 
2016-03-01 18:00:00 - 12 

リストは単なる例であり、結果の数はかなり高い(約1000件の結果)ので、私は演奏の解決策が必要です;-)これも可能ですか?助言がありますか?どうもありがとう!

Btw。私はデータベースの下にpostgresqlを使用します。

+0

あなたが ''明確な()で試したことがありますか? - > 'qs.distinct( 'value')'ここで 'qs 'はクエリセットです – Gocht

+0

この値のセット(時間順):' 12,12,90,90,90,12'を考えてみましょう。どの結果が正しいか:a) '12,90'またはb)' 12,90,12'?つまり、値が再び上がっても、他の値で区切られている場合は重複しているかどうか –

+0

@Gocht私は試しましたが、それは私に 'SELECT DISTINCT ON式は最初のORDER BY式と一致する必要があります'例外です。 – dArignac

答えて

2

this beautiful postに基づいてPOSTGRESQLでのみ動作する1つのクエリ解決策が見つかりました。現在の行の前の任意の行の値を評価するために使用できるpostgres lead関数を使用する方法を説明しています。下のクエリでclubs_mymodelを[yourappname] _mymodelに置き換えてください。するとすぐに準備が整います。

出力:

for m in MyModel.objects.all(): 
    print m 

2016-03-21 10:00:00+00:00 - 124.0 
2016-03-21 11:00:00+00:00 - 124.0 
2016-03-21 12:00:00+00:00 - 99.0 
2016-03-21 13:00:00+00:00 - 99.0 
2016-03-21 14:00:00+00:00 - 99.0 
2016-03-21 16:00:00+00:00 - 103.0 
2016-03-21 15:00:00+00:00 - 103.0 
2016-03-21 17:00:00+00:00 - 176.0 
2016-03-21 18:00:00+00:00 - 12.0 
2016-03-21 19:00:00+00:00 - 12.0 
2016-03-21 20:00:00+00:00 - 90.0 
2016-03-21 21:00:00+00:00 - 12.0 

q = MyModel.objects.raw('SELECT m1.id, m1.value, m1.date_seen \ 
    FROM (SELECT m2.id, m2.value, m2.date_seen, lead(m2.value) \ 
     OVER (ORDER BY m2.date_seen DESC) as prev_value \ 
     FROM clubs_mymodel m2 ORDER BY m2.date_seen) as m1 \ 
    WHERE m1.value IS DISTINCT FROM m1.prev_value \ 
    ORDER BY m1.date_seen ASC') 

for m in q: 
    print m 

2016-03-21 10:00:00+00:00 - 124.0 
2016-03-21 12:00:00+00:00 - 99.0 
2016-03-21 15:00:00+00:00 - 103.0 
2016-03-21 17:00:00+00:00 - 176.0 
2016-03-21 18:00:00+00:00 - 12.0 
2016-03-21 20:00:00+00:00 - 90.0 
2016-03-21 21:00:00+00:00 - 12.0 
+1

これは100%正しいです。私は文字通り5秒で、答えを投稿しました。これは、コードと参照を含めて、ほぼ同じ言葉の単語でした;)より良い解決策はないと思います。 –

+1

うわー、これです、ありがとう!私は何かがなければならないことを知っていた。私は記事を読んで、私が持っている追加の制約(それは私が意図的に言及しなかった)に調整し、それはうまくいった。すばらしいです! – dArignac

関連する問題