Я пытаюсь преобразовать этот простой SQL запрос в то Django может работать:Оптимизировать аннотированный запрос в Django
SELECT *
FROM location AS a
WHERE a.travel_distance = (
SELECT MAX(travel_distance)
FROM location AS b
WHERE b.person_id = a.person_id
)
ORDER BY a.travel_distance DESC
То, что это в основном делает, все выборки пройденных мест и выбрать только те строки, которые содержат максимальное перемещение расстояние.
Это то, что я получил до сих пор:
travels = Location.objects.filter(pk__in=Location.objects.order_by().values('person_id').annotate(max_id=Max('id')).values('max_id')).order_by('travel_distance')[::-1]
Хотя результаты соответствуют друг другу. Второй метод возвращает результаты намного дольше.
Есть ли способ переписать этот запрос, чтобы он стал быстрее?
Кроме того, вы можете дважды проверить свой запрос, поскольку я не думаю, что он возвращает строки с максимальным расстоянием перемещения. Ваши аннотации с Max ('id'), а также возвращаемое местоположение pk действительно соответствуют идентификаторам человека. – Fiver