1

我使用Django包使用HyperLogLog (hll) 字段来表示唯一用户。django-pg-hll我想做的是在特定时间段内获得唯一用户的累计总数,但我在这样做时遇到了麻烦。

给定一个模型,如:

class DailyUsers(model.Model):
  date = models.DateField()
  users = HllField()

HllField我可以像这样得到每天的累积值:

queryset = models.DailyUsers.objects.annotate(
  cumulative_hll_users=Window(
    UnionAgg("users"), order_by=F('date').asc()
  )
)

但是,当我尝试cardinality像这样获得(实际数字)时:

queryset = queryset.annotate(
  cumsum=Cardinality("cumulative_hll_users")
)

出现以下错误:

django.db.utils.ProgrammingError: OVER specified, but hll_cardinality is not a window function nor an aggregate function
LINE 1: SELECT "app_dailyusers"."date", hll_cardinality...

这很奇怪,因为Cardinality它被定义为聚合函数。我不确定是否有办法解决这个问题,我想可以在原始 sql 中做到这一点,但我没有取得太大进展。

非常感谢 Django ORM 或原始 SQL 中的解决方案。

4

1 回答 1

1

出现此错误是因为django-pg-hllpacakage 使用hll_cardinality函数而不是#窗口函数的运算符。转向rawsql 解决方案解决了这个问题。

于 2020-05-26T07:55:48.157 回答