2017-10-11 8 views
0

私はpostgresの基本的な拡張機能ですtimescaledbを使用しています。これにはtime_bucketというSQL関数が付属しています。Django ORM QuerysetにカスタムSQL関数(date_truncに似ています)に注釈を付けます

SELECT 
    time_bucket('1 minute', time) AS tb, 
    AVG(s0) 
FROM measurements 
WHERE 
    time >= to_timestamp(1) AND 
    time <= to_timestamp(2) 
GROUP BY tb 
ORDER BY tb ASC; 

models.py

class Measurement(models.Model): 

    device_id = models.IntegerField(primary_key=True) 
    time = models.DateTimeField() 
    s0 = models.FloatField(blank=True, null=True) 
    s1 = models.FloatField(blank=True, null=True) 

私はこれまで試してみてください。

class TimeBucket(Func): 

    function = 'time_bucket' 
    template = '%(function)s(\'{bucket_width}\', %(expressions)s)'.format(bucket_width='1 minute') 


(Measurement.objects 
    .values('time') 
    .annotate(tb=TimeBucket('time')) 
    .annotate(s_desc=Avg('s0')) 
    .filter(
     time__gte=datetime.fromtimestamp(start), 
     time__lte=datetime.fromtimestamp(end)) 
    .order_by('tb') 
) 

結果を次のように私は、クエリを生成するためのORMとの組み合わせで、この機能を使用したいですin:

SELECT 
    "measurements"."time", 
    time_bucket('1 minute', "measurements"."time") AS "tb", 
    (AVG("measurements"."s0")) AS "s_desc" 
FROM "measurements" 
WHERE (
    "measurements"."time" <= 2447-10-02 14:17:01+00:00 AND 
    "measurements"."time" >= 1970-01-01 00:00:01+00:00 
) 
GROUP BY "measurements"."time", time_bucket('1 minute', "measurements"."time") 
ORDER BY "tb" ASC 

あなたは左の2つの醜い点がある見るように:どのように私はそれを繰り返すのではなく、GROUP BYにエイリアスtbを使用することができ

  • time_buckets0を照会するだけです。どのようにtimeを取り除くことができますか?

答えて

1

集計関数の前に切り捨て値の注釈を.values()(たとえば.values('tb'))で使用する必要があります。

ジャンゴ1.11で
qs = (
    Measurement.objects 
    .filter(...) 
    .annotate(tb=TimeBucket('time')) 
    .values('tb') 
    .annotate(s_desc=Avg('s0')) 
    .order_by('tb') 
) 

.annotate(tb=TimeBucket('time')) 
.values('tb') 

.values(tb=TimeBucket('time')) 
に回線をよりDRY溶液を使用して組み合わせることが可能です
関連する問題