2016-05-11 5 views
2

私は次のアグリゲーションに頭を壊しています。私は、平均デバイスが日付xとyとの間でチェックする異なるページの量を取得したい。モデルのDjangoアグリゲーション:ユニークなフィールドの平均出現回数

擬似コード:

class Statistic: 
    device_id = int 
    date = date 
    page_id = int 

誰もがこれを完了する方法を知っている:

Statistic.objects.filter(date__gte=x,date__lte=y).??? 

UPDATE:

:質問が明確でない場合には、ここでの例であります
  • 次のような固有のdevice_id値をすべて取得します。テーブル。
  • これらの固有のdevice_id値のそれぞれについて、テーブル内で発生する一意のpage_id値の数をカウントします。これらの値をリストに追加します。
  • そのリストの平均を計算します。

しかし、これはループ内のクエリであり、各device_idの新しいクエリは明らかに効率的ではありません。私は1-2のクエリでそれを行う方法を探しています。私はあなたがページのxとyの日付の間の各デバイスのチェックの平均数を取得したい正しくあなたの質問を理解していれば

+0

あなたは「チェック」とはどういう意味ですか、別のモデル 'Device'か何かと関係があるのでしょうか? もし私が得たならば、 'x'と' y'の日付の間にすべてのStatisticを取得し、集計して平均を得るためにどのデバイスがそれをチェックしたのかを知りたいでしょうか? –

+0

日付の重要性はあまりありません。これらはiOS/Androidの統計情報であり、device_idはデバイスuuidを参照していますが、user_idと見なすことができます。私は平均的なユーザーが何ページ(= distinct page_id)を訪れているか知りたい。 – tdma

+0

そのため、特定のdevice_idの各統計情報を取得したいと思います。ユニークなページが1回訪問された(1回)ごとに、そのデバイスが訪問したページ数を知りたいと思います。すべてのデバイスを繰り返し、固有の訪問済みページの平均を取得しますか? –

答えて

0

私は明確なのthinkinいた場合、これはそれを行う必要があります。

Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').annotate(count=Count('device_id')).aggregate(avg=Avg('count')) 
0

、あなたはこのように行うことができますユニークなデバイスの数を見つける必要があることについては

devices= Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').distinct().count() 

今、この範囲内のオブジェクトの数を見つける:

pages = Statistic.objects.filter(date__gte=x,date__lte=y).count()  
avg_pages_per_device = pages/devices 
+0

私はそれを正しく理解していれば、この提案された解決策は正しくありません。 – tdma

1

Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')

デバイスによって1回訪問されたページを表示するQuerysetを提供します(独自の方法で)、必要なデータのみを取得します。

その後、あなたはこれを計算するためのPythonを使用することができます。

data = Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id') 
devices_set = set([d['device_id'] for d in data]) 
grouped = dict([(d, []) for d in devices_set]) 
for d in data: 
    for g in grouped: 
     if d['device_id'] == g: 
      grouped[g].append(d['page_id']) 

あなたは、あなたはあなたがやりたいことができ、Pythonの辞書にdeviced_idが訪れ、すべてのユニークなpage_idを持っています。

あなたが与えたモデルは他のモデルと関連していないようですので、私たちがデータベース側にするためにQuerysetを最適化できるかどうかはわかりません。

+0

ちょっとマキシム、ご協力いただきありがとうございます。この問題は、統計線が多数になる可能性があるため、メモリを消費するという問題があります。だから私はデータベース側でそれをやりたい – tdma

+0

次に、他のテーブル(モデル)を作成してこれらに参加させる必要があります。例えば。 device_idをForeignKeyにします(そしてpage_idも同様です)。 –

+0

ネストしたクエリを持つ生のSQLです。生のSQLでは、これを表現するのに問題はありません。 – tdma