HyperLogLog (HLL) Postgres 字段的 Django 累积和

Django culmulative sum of HyperLogLog (HLL) Postgres field

我正在使用 HyperLogLog (hll) field to represent unique users, using the Django 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 被定义为 aggregate 函数。我不确定是否有办法解决这个问题,我想可以在原始 sql 中做到这一点,但我没有取得太大进展。

Django ORM 或原始 SQL 中的解决方案将不胜感激。

出现此错误是因为 django-pg-hll 程序包使用 hll_cardinality 函数而不是 window 函数的 # 运算符。转向 raw sql 解决方案解决了问题。