首页 > 解决方案 > Django窗口函数FirstValue产生无效的SQL

问题描述

我正在尝试使用窗口函数来获取每个组中的第一个并生成下面的 sql 查询 - 我使用了 sql 并在控制台中使用它,似乎 CAST() 函数导致了这个问题。有没有办法在查询中摆脱这个?

Django 2,1 代码:

def contract_list(user):

    price_window = Window(
        expression=FirstValue('settle_price'),
        partition_by=F('contract'),
        order_by=F('trade_time').desc()
    )

    market_prices = Trade.objects.filter(
        contract__isnull=False
    ).annotate(
        market_price=price_window
    ).values(
        con=F('contract'),
        market_price=F('market_price'),
    ).order_by(
        'contract'
    ).all()

生成在 SQLite3 数据库上运行的此 SQL:

SELECT 
    CAST(FIRST_VALUE("trading_trade"."settle_price") AS NUMERIC) OVER PARTITION BY "trading_trade"."contract_id" ORDER BY "trading_trade"."trade_time" DESC) AS "market_price", 
    "trading_trade"."contract_id" AS "con" 
FROM 
    "trading_trade" 
WHERE 
    "trading_trade"."contract_id" IS NOT NULL 
ORDER BY 
    "trading_trade"."contract_id" ASC

同样,这个问题似乎与CAST(FIRST_VALUE("trading_trade"."settle_price") AS NUMERIC)删除 cast 函数会产生结果集有关。

标签: djangosqlitedjango-ormwindow-functions

解决方案


推荐阅读