Задать вопрос
@nurzhannogerbek

Как отфильтровать записи по ближайшей дате?

Здравствуйте! Помогите пожалуйста разобраться.

У меня есть следующая модель данных.

models.py:
class Securities(models.Model):
    section = models.ForeignKey(Section)
    characteristic = models.ForeignKey(Characteristics)
    bool_value = models.NullBooleanField()
    change_date = models.DateTimeField()
    real_change_date = models.DateTimeField()


У примеру в таблице есть такие записи:
SECTION  | CHARACTERISTIC | CHANGE_DATE | BOOL_VALUE
   A     |       8328     |  15.02.2018 |      1
   A     |       8328     |  02.09.2018 |      0
   B     |       8328     |  02.09.2018 |      1
   C     |       8328     |  02.09.2018 |      1
   C     |       8328     |  20.09.2018 |      0


Я пытаюсь отфильтровать подобную таблицу:
SECTION  | CHARACTERISTIC | CHANGE_DATE | BOOL_VALUE
   C     |       8328     |  20.09.2018 |      0
   B     |       8328     |  02.09.2018 |      1
   A     |       8328     |  02.09.2018 |      0



То есть отфильтровать записи таким образом, чтобы у похожих записей брались лишь та у которой ближайшая дата.

Я попытался сделать следующее:
securities = Securities.objects.filter(characteristic=8328).order_by('-change_date').values_list('section').distinct()


Данный код возвращается 36 записей, и записи все равно дублируются. То есть есть две записи A. Хотя нужно оставить одну. При этом когда я пишу print(securities.count()) мне пишет количество 33. Что вообще происходит. Как решить данную проблему, друзья?
  • Вопрос задан
  • 200 просмотров
Подписаться 1 Простой 2 комментария
Ответ пользователя ponaehal К ответам на вопрос (3)
@ponaehal
По ощущениям, спасет коррелированный подзапрос. Как то так:
SELECT * FROM securities t
WHERE t.change_date IN (SELECT Max(t1.change_date) FROM securities t1 WHERE t.section=t1.section)
Если будет долго работать, то подозреваю, что можно придумать что-нибудь более производительное с использованием аналитических функций...
Ответ написан