Как найти ближайшие две строки вверх и вниз от заданного значения строки - PullRequest
0 голосов
/ 20 февраля 2020

Как вернуть 5 баз данных, 5 строк, две строки с ближайшим верхним значением и две строки с ближайшим нижним значением заданного значения? Например: точки: 22, 25, 27, 30, 20, 22, 23, 42, 15, 18, 28,

Предположим, что заданное значение равно 23,

, поэтому возврат значения будут - 22,22,23,25,27 сортировать по дате изменения. Я использую Django и postgres.

. В настоящее время я отдельно - возвращаю ближайший верхний и нижний 2 ряд.

    total_points = user.total_points
    # userData = PointLeaderboard.objects.filter(user=user).first()
    leaderObj = []
    upperRanks = reversed(PointLeaderboard.objects.filter(
        Q(total_points__gt=total_points) |
        Q(total_points=total_points, pk__gt=user.id)
    ).order_by('-date_modified', 'total_points')[:2])

    for upperRank in upperRanks:
        print(upperRank.user.id)
        print(upperRank.total_points)
        row = {
            'username':'',
            'email': upperRank.user.email,
            'total_points':upperRank.total_points,
            'point_difference': '+'+str((upperRank.total_points - total_points)),
            'is_current_user':False
        }
        leaderObj.append(row)
    row = {
        'username': '',
        'email': user.email,
        'total_points': total_points,
        'point_difference': '0',
        'is_current_user': True
    }
    leaderObj.append(row)

    lowerRanks= PointLeaderboard.objects.filter(
        Q(total_points__lt=total_points) |
        Q(total_points=total_points, pk__lt=user.id)
    ).order_by('-total_points', 'date_modified')[:2]
    for lowerRank in lowerRanks:
        row = {
            'username': '',
            'email': lowerRank.user.email,
            'total_points': lowerRank.total_points,
            'point_difference': str((lowerRank.total_points - total_points)),
            'is_current_user': False
        }
        leaderObj.append(row)

Но проблема в том, что точка совпадает с несколькими значениями, мне нужно сначала отсортировать по самому старому. Каков будет правильный подход к преодолению этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...