El requisito de clave principal en SQL sin formato complica la consulta en Django

Para obtener el valor máximo de una tabla de valores simple, puedo escribir la siguiente consulta en Django:

MyTable.objects.aggregate(Max('value'))

El SQL generado es:'SELECT MAX("mytable"."value") AS "value__max" FROM "mytable"'

Ahora si escribo el mismo SQL usando el administrador de consultas sin formato:

1. MyTable.objects.raw('SELECT max(value) FROM mytable')

Django arroja un errorInvalidQuery: Raw query must include the primary key. Esto también se menciona en los documentos de Django: "Solo hay un campo que no puede omitir: el campo de clave principal". Entonces, después de agregar elid campo, necesitoGROUP BY también. La nueva consulta se convierte en:

2. MyTable.objects.raw('SELECT id, max(value) FROM mytable GROUP BY id')

Esto ya no me da un solo valor máximo porque me veo obligado a usarGROUP BY id. Ahora necesito agregar unORDER BY yLIMIT para obtener la respuesta esperada para una instrucción SQL que de otro modo sería simple.

3. MyTable.objects.raw('SELECT id, max(value) AS mv FROM mytable GROUP BY id ORDER BY mv DESC LIMIT 1')

¿Hay alguna manera de simplificar la consulta anterior, es decir, no usar ORDER / LIMIT / GROUP BY (FWIW, usando PosgreSQL)?

Actualizar:

Aquí hay un truco que funcionará. Alias el valor máximo comoid para hacer feliz a Django. ¿Hay algún problema aquí?

MyTable.objects.raw('SELECT max(value) AS id FROM mytable')

Actualización 2:

Aquí está el plan de consulta para el SQL simple (1) frente al complicado final (3):

"Aggregate  (cost=5.25..5.26 rows=1 width=2) (actual time=0.155..0.155 rows=1 loops=1)"
"  ->  Seq Scan on mytable  (cost=0.00..4.60 rows=260 width=2) (actual time=0.018..0.067 rows=260 loops=1)"
"Total runtime: 0.222 ms"


"Limit  (cost=9.80..9.80 rows=1 width=6) (actual time=0.548..0.548 rows=1 loops=1)"
"  ->  Sort  (cost=9.80..10.45 rows=260 width=6) (actual time=0.545..0.545 rows=1 loops=1)"
"        Sort Key: (max(value))"
"        Sort Method: top-N heapsort  Memory: 25kB"
"        ->  HashAggregate  (cost=5.90..8.50 rows=260 width=6) (actual time=0.328..0.432 rows=260 loops=1)"
"              ->  Seq Scan on mytable  (cost=0.00..4.60 rows=260 width=6) (actual time=0.018..0.069 rows=260 loops=1)"
"Total runtime: 0.638 ms"

PD La consulta real es más complicada (algo relacionada con esta respuesta:https://dba.stackexchange.com/a/86404/52114)

Respuestas a la pregunta(3)

Su respuesta a la pregunta