首页 > 解决方案 > Django 将窗口函数与标准注释相结合

问题描述

我有一个 Django 模型,我正在尝试在其上实现 Windows 函数和标准注释。理想情况下,我想返回行的排名并获得同一查询集中另一列的聚合。

作为下面映射的示例:

queryset = ProductData.objects.values('date','sku)
.annotate(row_number=ExpressionWrapper(Window(expression=RowNumber(),
                                              partition_by=[F('sku')],
                                              order_by=F('date').asc()),
                                              output_field=FloatField()))
.annotate(units_sold=ExpressionWrapper(Sum(F('units_sold')), output_field=FloatField()))
.order_by('date','sku')

结果发布的查询是:

选择product_dataSKU, DATE_FORMAT( product_data. date, '%Y-%m-%d') AS date, ROW_NUMBER() OVER (PARTITION BY product_data. SKUORDER BY product_data. DATEASC) AS row_number, SUM( product_data. Units_Sold) AS Units_Sold FROM product_data GROUP BY product_data. SKU, DATE_FORMAT( product_data. date, '%Y-%m-%d'), ROW_NUMBER() OVER (PARTITION BY product_data. SKUORDER BY product_data. DATEASC) ORDER BY dateASC, product_data. SKU升学 **

运行此方法时,我收到以下错误: 错误代码:3593。您不能在此上下文中使用窗口函数“row_number”。

查询需要是:

选择product_dataSKU, DATE_FORMAT( product_data. date, '%Y-%m-%d') AS date, ROW_NUMBER() OVER (PARTITION BY product_data. SKUORDER BY product_data. DATEASC) AS row_number, SUM( product_data. Units_Sold) AS Units_Sold FROM product_data GROUP BY product_data. SKU, DATE_FORMAT( product_data. date, '%Y-%m-%d') 按dateASC 排序, product_data. SKUASC

问题是 Windows 函数定义的第一个注释创建了一个新的“值列”。因此,在 django by defualt 中,当我调用第二个注释时,它对所有Value字段执行分组。在 django 上下文中,group by 然后是[sku, date, row_number]。我需要建立分组依据以仅使用提供的值而不包括 Windows 函数。

结果应如下所示:

库存单位 日期 行号 units_sold
SKU-A 2020-04-01 1 0
SKU-A 2020-04-02 2 1
SKU-A 2020-04-03 3 1
SKU-A 2020-04-04 4 1
SKU-A 2020-04-05 5 2
SKU-A 2020-04-06 6 4
SKU-A 2020-04-07 7 3

我在这个线程上看到了一个类似的问题: Django Window annotation using combined with distinct Clause

但没有具体的解决办法。

在 Django 关于窗口函数的文档下方: https ://docs.djangoproject.com/en/3.1/ref/models/expressions/#window-functions

标签: pythonmysqldjango

解决方案


推荐阅读