Упорядочено по последнему активному времени, но взвешено по полу - PullRequest
1 голос
/ 08 февраля 2020

В настоящее время я делаю заказ по последнему активному времени пользователя, где самые последние активные пользователи отображаются вверху.

"profile".last_active_time DESC NULLS LAST,
"profile".id DESC

Я бы хотел показать больше женщин вверху, поэтому я попытался это, но ясно, что в конечном итоге все женщины показываются вверху.

CASE WHEN "profile_date:gender_type".type_id = 'FEMALE' THEN 1 ELSE 0 END,
"profile".last_active_time DESC NULLS LAST,
"profile".id DESC

Как бы я упорядочил по последнему активному времени в основном, но взвешенно, так что женщины получают немного больший приоритет, чтобы иметь возможность показать например, мужчина, который был активен совсем недавно в тот же день?

Пример:

  • мужчина последний активен 1 час a go, женщина последний активен 1 неделя a go => самец появляется первым
  • самец последний раз активен 1 час a go, самка последний раз активен 2 часа a go => самка имеет шанс появиться раньше, чем самец

В данный момент пользователь A всегда появляется перед пользователем B, если A последний раз был активным перед B. Если пользователь A является мужчиной, а пользователь B - женским, а A был последним активным перед B, A все еще всегда отображается перед Б. Я хочу, чтобы, если пользователь А был мужчиной, а пользователь B - женщина, и A был последним активным до B, B мог бы появиться до A.

Это не должно быть сделано в явные периоды времени, и я предположил бы random() взвешенные проценты будут работать. Не обязательно быть идеальным.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2020

Вы можете дать женщинам на 1 час вперед, как это:

ORDER BY 
    "profile".last_active_time + CASE 
        WHEN "profile_date:gender_type".type_id = 'FEMALE' THEN time '01:00' 
        ELSE time '00:00' 
    END DESC NULLS LAST,
    "profile".id DESC
1 голос
/ 08 февраля 2020

Преобразование last_active_time во время в прошлом, затем взвесьте это время, сколько вы выберете.

order by 
    (now()-last_active_time) * case when type_id = 'FEMALE' then 0.5 else 1.0 end, 
    id desc;
...