Django查询集粒度

时间:2012-09-15 06:34:14

标签: python django

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

现在说Tom有30天的卡路里历史,Dani在那张桌子上有365天的卡路里历史。

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

即:如果总记录数超过30,我需要粒度。如果超过30,我需要10天(或多或少)粒度。

我希望我的解释是可以理解的。

1 个答案:

答案 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