0

假设我有一张桌子,每人每天有一条记录,记录该人当天摄入的总卡路里。

现在假设 Tom 有 30 天的卡路里历史,而 Dani 在这张桌子上有 365 天的卡路里历史。

我如何在 Dani 的卡路里历史记录上运行 Django 查询集,获取卡路里读数,收集总共 30 条记录,彼此相隔 10 天,这样如果我为两个人运行相同的代码,我将得到两个他们 - 30 条记录,而不是 Tom 的 30 条记录和 Dani 的 365 条记录。

即:如果总记录数超过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 回答