python - 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_data
。SKU
, DATE_FORMAT( product_data
. date
, '%Y-%m-%d') AS date
, ROW_NUMBER() OVER (PARTITION BY product_data
. SKU
ORDER BY product_data
. DATE
ASC) 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
. SKU
ORDER BY product_data
. DATE
ASC) ORDER BY date
ASC, product_data
. SKU
升学
**
运行此方法时,我收到以下错误: 错误代码:3593。您不能在此上下文中使用窗口函数“row_number”。
查询需要是:
选择product_data
。SKU
, DATE_FORMAT( product_data
. date
, '%Y-%m-%d') AS date
, ROW_NUMBER() OVER (PARTITION BY product_data
. SKU
ORDER BY product_data
. DATE
ASC) 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') 按date
ASC 排序, product_data
. SKU
ASC
问题是 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
解决方案
推荐阅读
- nginx - 通过 Unix 域套接字连接 Nginx 和 Varnish 6 不起作用
- javascript - Vuex 模块中的两个级别
- angular - 从模式弹出窗口执行 router.navigate 时,this.router.navigate 不是函数错误
- elasticsearch - 在 Elasticsearch 中添加子聚合
- c# - 使用 mvc 视图中的参数从 jquery 调用 web api
- ios - UIViewController 继承:将参数传递给作为 UIViewController 子类的父类
- node.js - 从 Nodejs 服务器将 JSON 数组数据解析为 Jade 模板
- python - 如何在 Python 中修复这个嵌套的 for 循环
- dialogflow-es - Dialogflow 创建 followup-2 上下文
- ruby-on-rails - rake 任务中的多个文件基名