假设我有一张桌子,每人每天有一条记录,保留当天该人的总卡路里。
现在说Tom有30天的卡路里历史,Dani在那张桌子上有365天的卡路里历史。
如何在Dani的卡路里历史上运行Django查询集,获取卡路里读数,共收集30条记录,每条记录相隔10天,这样如果我为两个人运行相同的代码,我会得到对于他们两个 - 汤姆的30条记录而不是30条记录和Dani的365条记录。
即:如果总记录数超过30,我需要粒度。如果超过30,我需要10天(或多或少)粒度。
我希望我的解释是可以理解的。
答案 0 :(得分:-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