0

1 人 1 日 1 レコードのテーブルがあり、その日にその人が食べた総カロリーを保持しているとします。

ここで、Tom には合計 30 日間のカロリー履歴があり、Dani には合計 365 日間のカロリー履歴があるとします。

Dani のカロリー履歴で Django クエリセットを実行し、カロリーの読み取り値を取得し、合計 30 のレコードを収集し、10 日ごとに互いに間隔を空けて、2 人に対して同じコードを実行すると、両方を取得するにはどうすればよいですか?それら - Tom の 30 レコードと Dani の 365 レコードではなく、30 レコード。

例: 合計レコード数が 30 を超える場合は、粒度が必要です。30 を超える場合は、10 日 (多かれ少なかれ) 粒度が必要です。

私の説明が理解できることを願っています。

4

1 に答える 1

-1

カスタムSQLを書くことでこれを解決します。postgresの場合、私はこのようなことができます

select * from
    (select row_number() over(order by id) as row_num, * 
    from calorie
    where user_id = 12345
    order by id) as q
where row_num % ((select count(*) 
          from calorie 
          where user_id = 12345)/30) = 0

ここでは、最初にユーザーにクエリ全体をクエリし、row_numbers を与えます

select row_number() over(order by id) as row_num, * 
        from calorie
        where user_id = 12345
        order by id

次に、行間の距離を見つけました。

((select count(*) 
          from calorie 
          where user_id = 12345)/30)

これは 30 行の場合で、30 行を下回るとゼロ除算がスローされます。次に、row_distanceで割り切れる行のみを取得しました

row_num % row_distance = 0

私には簡単に思えるサンプリングを使用することもできます。また、30未満の行番号でも機能します

select *
from calorie 
where user_id = 12345
order by random()
limit 30
于 2012-09-15T09:44:05.893 に答える