У меня есть таблица с именем user_teams, которая имеет следующие столбцы:
id: primary key
user_id: FK to users table
team_id: FK to teams table
effective_date: Date
Я хочу получить запрос, который задан набор идентификаторов команд, он дает мне количество пользователей, которые в настоящее время принадлежат к этой команде. Текущая часть важна, и поэтому существует effective_date
. Например, если пользователь с идентификатором 1 сначала принадлежал команде с идентификатором 1, а затем принадлежал команде с идентификатором 2, было бы две строки:
id: 1
user_id: 1
team_id: 1
effective_date: '2020-01-01'
id: 2
user_id: 1
team_id: 2
effective_date: '2020-02-01'
И этот пользователь должен быть просто посчитан для команды с идентификатором 2. У меня есть следующий запрос, который выполняет то, что я ищу, но мне не нравится, потому что подвыбор будет в основном go по всей таблице:
SELECT ut.team_id, COUNT(*) as count
FROM (
SELECT DISTINCT ON (ut.user_id) ut.*
FROM user_teams ut
ORDER BY ut.user_id, ujpjl.effective_date DESC
) ut
WHERE ut.team_id IN (<PASSED_TEAM_IDS>)
Я могу ' t переместить ГДЕ внутрь подвыбора, потому что, если, например, я должен использовать предыдущий пример и выполнить запрос для team_id 1:
SELECT ut.team_id, COUNT(*) as count
FROM (
SELECT DISTINCT ON (ut.user_id) ut.*
FROM user_teams ut
WHERE ut.team_id IN (1)
ORDER BY ut.user_id, ujpjl.effective_date DESC
) ut
Он будет считать пользователя, что в какой-то момент он был в команда 1, но это больше не так.
Есть ли другой способ сделать этот запрос, чтобы мой подвыбор не go прошел по всей таблице user_teams?