【问题标题】:Count occurrences of values on a single column grouped by week计算按周分组的单个列上值的出现次数
【发布时间】:2018-06-11 15:55:45
【问题描述】:

我正在尝试使用 Django 2.0 ORM 来完成此任务,但如果您可以使用原始 SQL 查询来解决此问题,那也会很有帮助。

例如,我有一个包含“destination”列的表格,它始终是一个城市的名称,例如“Los Angeles”、“New York”、“San Francisco”或“Seattle”(但我们事先不知道会有多少个不同的城市)。

我需要一个 SQL 查询(或 Django ORM 代码)来获取指定日期范围内所有城市的计数,按记录的周分组(基于 created_at 时间戳,周从星期一开始)。

这是一个Django模型的例子(很简单):

from django.db import models
from django.utils import timezone


class Package(models.Model):
    id = models.AutoField(serialize=False, primary_key=True)
    name = models.CharField(max_length=64)
    email = models.CharField(max_length=128, unique=True)
    phone = models.CharField(max_length=32)
    destination = models.CharField(max_length=64)
    created_at = models.DateField(db_index=True, default=timezone.now)
    updated_at = models.DateField(default=timezone.now)

这是所需输出的示例,结构为 JSON:

{
    "2017-06-05-2017-06-11": {
        "Los Angeles": 100,
        "New York": 50,
        "Copenhagen": 20
    },
    "2017-06-12-2017-06-18": {
        "Los Angeles": 10,
        "Toronto": 23,
        "Las Vegas": 21,
        "Carson City": 8,
        "Raleigh": 1
    },
    "2017-06-19-2017-06-25": {
        "Toronto": 24,
        "Tokyo": 75,
        "Kansas City": 123,
        "Salem": 84,
        "Bismarck": 22,
        "Boise": 77,
        "Las Vegas": 123
    }
}

请注意,结果的大小可能会有所不同,日期范围都从星期一开始,到星期日结束(包括两者),并且城市名称是可变的且未知的。

我知道有一些方法可以将其构建到 Python 逻辑中并执行许多查询,但我希望我们可以在单个查询中完成此操作。谢谢!

【问题讨论】:

  • 可以展示模型吗?
  • 是的,输入也很有趣

标签: python mysql sql django django-orm


【解决方案1】:

对于原始查询,您可以按计数分组

select destination, week(created_at,1), count(*)
from my_table
group by destination, week(created_at,1)

【讨论】:

  • 谢谢,这很好用!只需将年份添加到选择/分组依据。希望有人可以帮助使用 Django ORM 复制此内容,但如果没有人能够做到这一点,则会将其标记为正确。
  • 另外,您对索引有什么建议可以加快查询速度吗?
  • 你正在扫描所有的表并且没有加入所以我认为索引没有用..
  • 如果我们想在where 子句中指定日期范围、星期范围或特定星期怎么办?
  • 如果你想要一个日期范围,那么 created_at 列上的索引很有用.. .. 通常没有连接是建议索引候选列的 where 条件。
猜你喜欢
  • 1970-01-01
  • 2016-12-20
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多