Django,Postgresql 按月函数聚合也使用年
Django, Postgresql Aggregate By Month Function is Also Using Year
我有一个数据库 table,其中包含 "tickets" 超过 2 年的时间。每张票都有一个工作日期。我想按年计算每个月的门票总数(例如 2018 年 1 月与 2019 年 1 月不同)。
当我拼凑查询时,我偶然发现了一些有用的东西,但我不知道为什么。或者查询是否有意义。这是:
qs = Ticket.filter(work_date__range=[datetime.date(2018, 1, 1),
datetime.date.today()]).\
annotate(year=ExtractYear('work_date'),
month=ExtractMonth('work_date')).\
values('year','month').\
annotate(count=Count('month')).order_by('year', 'month')
给出这个输出:
{'count': 13816, 'year': 2018, 'month': 1},
{'count': 12778, 'year': 2018, 'month': 2},
{'count': 13960, 'year': 2018, 'month': 3},
{'count': 14128, 'year': 2018, 'month': 4},
{'count': 15277, 'year': 2018, 'month': 5},
{'count': 15689, 'year': 2018, 'month': 6},
{'count': 14905, 'year': 2018, 'month': 7},
{'count': 16025, 'year': 2018, 'month': 8},
{'count': 14044, 'year': 2018, 'month': 9},
{'count': 16332, 'year': 2018, 'month': 10},
{'count': 15397, 'year': 2018, 'month': 11},
{'count': 14348, 'year': 2018, 'month': 12},
{'count': 17166, 'year': 2019, 'month': 1},
{'count': 15504, 'year': 2019, 'month': 2},
{'count': 16311, 'year': 2019, 'month': 3},
{'count': 14910, 'year': 2019, 'month': 4},
{'count': 440, 'year': 2019, 'month': 5}
我的期望是,由于聚合函数仅按 'month' 计数,因此,例如,无论年份如何,所有第 1 月的计数都相同。
我 运行 按月进行简单查询并使用 .count() 方法,我得到与上述相同的结果。所以计数是正确的。
为什么这行得通?有更好的方法吗?
您通过 year/month 组合获得分组,因为这些是您的值。如果您想按月计算,请将 values('year','month')
更改为 values('month')
。
计数就是您正在计数的字段。
您可以改为数 'id',您将得到相同的数字。
您可以随时查看生成的查询,这可能会让您更清楚。
print(qs.query)
我有一个数据库 table,其中包含 "tickets" 超过 2 年的时间。每张票都有一个工作日期。我想按年计算每个月的门票总数(例如 2018 年 1 月与 2019 年 1 月不同)。
当我拼凑查询时,我偶然发现了一些有用的东西,但我不知道为什么。或者查询是否有意义。这是:
qs = Ticket.filter(work_date__range=[datetime.date(2018, 1, 1),
datetime.date.today()]).\
annotate(year=ExtractYear('work_date'),
month=ExtractMonth('work_date')).\
values('year','month').\
annotate(count=Count('month')).order_by('year', 'month')
给出这个输出:
{'count': 13816, 'year': 2018, 'month': 1},
{'count': 12778, 'year': 2018, 'month': 2},
{'count': 13960, 'year': 2018, 'month': 3},
{'count': 14128, 'year': 2018, 'month': 4},
{'count': 15277, 'year': 2018, 'month': 5},
{'count': 15689, 'year': 2018, 'month': 6},
{'count': 14905, 'year': 2018, 'month': 7},
{'count': 16025, 'year': 2018, 'month': 8},
{'count': 14044, 'year': 2018, 'month': 9},
{'count': 16332, 'year': 2018, 'month': 10},
{'count': 15397, 'year': 2018, 'month': 11},
{'count': 14348, 'year': 2018, 'month': 12},
{'count': 17166, 'year': 2019, 'month': 1},
{'count': 15504, 'year': 2019, 'month': 2},
{'count': 16311, 'year': 2019, 'month': 3},
{'count': 14910, 'year': 2019, 'month': 4},
{'count': 440, 'year': 2019, 'month': 5}
我的期望是,由于聚合函数仅按 'month' 计数,因此,例如,无论年份如何,所有第 1 月的计数都相同。
我 运行 按月进行简单查询并使用 .count() 方法,我得到与上述相同的结果。所以计数是正确的。
为什么这行得通?有更好的方法吗?
您通过 year/month 组合获得分组,因为这些是您的值。如果您想按月计算,请将 values('year','month')
更改为 values('month')
。
计数就是您正在计数的字段。 您可以改为数 'id',您将得到相同的数字。 您可以随时查看生成的查询,这可能会让您更清楚。
print(qs.query)