【问题标题】:Creating Django pgSQL Query With COUNT , GROUP BY , INTERVAL and LIMIT使用 COUNT 、 GROUP BY 、 INTERVAL 和 LIMIT 创建 Django pgSQL 查询
【发布时间】:2017-04-10 01:51:03
【问题描述】:

我正在尝试在 Django 中创建以下查询

SELECT content_reference , COUNT(reference) 
    AS total 
  FROM usage_statistics 
 WHERE content_type = 'blog' 
   AND access_date > NOW() - INTERVAL '90' DAY 
 GROUP BY content_reference 
 ORDER BY total DESC 
 LIMIT 10

到目前为止,我想出的是:

result = UsageStatistics.objects.values('content_reference')\
    .annotate(total=Count('reference'))\
    .order_by('total')

这使得查询

SELECT "usage_statistics"."content_reference", COUNT("usage_statistics"."reference") AS "total" 
  FROM "usage_statistics" 
 GROUP BY "usage_statistics"."content_reference" 
 ORDER BY "total" ASC 
 LIMIT 21

我不确定如何正确包含:

  • AND access_date > NOW() - INTERVAL '90' DAY
  • 按总 DESC 排序

以下是我的usage_statistics表结构

CREATE TABLE usage_statistics
(
  reference bigint
  access_date timestamp with time zone,
  ip_address inet NOT NULL,
  language_iso text NOT NULL,
  content_type character varying(12) NOT NULL,
  content_reference text NOT NULL,
  passport_user_id bigint
)

【问题讨论】:

    标签: python sql django postgresql


    【解决方案1】:

    您可以使用.filter() 限制在过去 60 天内更改的内容。可以使用数据库函数NOW(),或者您可以在 python 中进行数学运算:

    .filter(access_date__gt=datetime.datetime.utcnow() - datetime.timedelta(days=60))
    

    同样可以排序:

    .order_by('-total')
    

    最后,您可以对查询集进行切片以获得前 10 个结果:

    [:10]
    

    因此,您的最终查询可能类似于:

    result = UsageStatistics.objects.filter(
        access_date__gte=datetime.datetime.utcnow() - datetime.timedelta(days=60)
    ).values('content_reference').annotate(
        total=Count('reference')
    ).order_by('-total')[:10]
    

    【讨论】:

      【解决方案2】:

      使用: 结果 =UsageStatistics.objects.raw("SELECT content_reference , COUNT(reference) 作为总计 FROM usage_statistics WHERE content_type = '博客' AND access_date > NOW() - INTERVAL '90' DAY 按内容参考分组 按总 DESC 排序 限制 10")

      查看https://docs.djangoproject.com/en/dev/topics/db/sql/了解更多详情。

      【讨论】:

      • 对于这样的查询,无需下拉到原始 sql:这意味着您不能再对结果进行进一步的查询集级操作。
      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多