Как сделать ВЫБОР МАКС в Django?

DECLARE
    @Main TABLE
    (
        [name] VARCHAR(50),
        trip_id INT
    );

INSERT INTO @Main
(
    [name],
    trip_id
)
VALUES
(
    'Jim', 1
),
(
    'Ian', 2
),
(
    'Susan', 2
);

-- Option 1
SELECT
    [name],
    trip_id,
    COUNT(*) OVER () AS ct
FROM
    @Main;

-- Option 2
SELECT
    [name],
    trip_id,
    (
        SELECT
            COUNT(*)
        FROM
            @Main
    )
    ct
FROM
    @Main;

-- Option 3
SELECT
    [name],
    trip_id,
    v.ct
FROM
    @Main
    CROSS APPLY
        (
            SELECT
                COUNT(*) FROM @Main
        ) v (ct);

-- Option 4
SELECT
    t1.[name],
    t1.trip_id,
    t2.ct
FROM
    @Main t1
    JOIN
        (
            SELECT
                COUNT(*) ct
            FROM
                @Main
        ) t2
            ON 1 = 1;

-- Option 5
SELECT
    t1.[name],
    t1.trip_id,
    t2.ct
FROM
    @Main t1
    CROSS JOIN
        (
            SELECT
                COUNT(*) ct
            FROM
                @Main
        ) t2;

75
задан avenet 5 September 2016 в 19:33
поделиться

1 ответ

См. this . Ваш код будет примерно таким:

from django.db.models import Max
# Generates a "SELECT MAX..." query
Argument.objects.aggregate(Max('rating')) # {'rating__max': 5}

Вы также можете использовать это в существующих наборах запросов:

from django.db.models import Max
args = Argument.objects.filter(name='foo') # or whatever arbitrary queryset
args.aggregate(Max('rating')) # {'rating__max': 5}

Если вам нужен экземпляр модели, содержащий это максимальное значение, то опубликованный вами код, вероятно, является лучшим способом сделать это:

arg = args.order_by('-rating')[0]

Обратите внимание, что это приведет к ошибке, если набор запросов пуст, т. Е. Если ни один аргумент не соответствует запросу (поскольку часть [0] вызовет ошибку IndexError ). Если вы хотите избежать такого поведения и вместо этого просто вернуть None в этом случае, используйте .first () :

arg = args.order_by('-rating').first() # may return None
140
ответ дан 24 November 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: