Хорошо, так что название немного запутанное. По сути, это проблема типа «наибольшие числа групп», но я не могу понять, насколько я понимаю.
У меня есть таблица user_stats:
------------------+---------+---------------------------------------------------------
id | bigint | not null default nextval('user_stats_id_seq'::regclass)
user_id | bigint | not null
datestamp | integer | not null
post_count | integer |
friends_count | integer |
favourites_count | integer |
Indexes:
"user_stats_pk" PRIMARY KEY, btree (id)
"user_stats_datestamp_index" btree (datestamp)
"user_stats_user_id_index" btree (user_id)
Foreign-key constraints:
"user_user_stats_fk" FOREIGN KEY (user_id) REFERENCES user_info(id)
Я хочу получить статистику для каждого идентификатора по последней дате. Это большая таблица, где-то около 41 м строк, поэтому я создал временную таблицу user_id, last_date, используя:
CREATE TEMP TABLE id_max_date AS
(SELECT user_id, MAX(datestamp) AS date FROM user_stats GROUP BY user_id);
Проблема в том, что метка даты не уникальна, поскольку может быть более одного обновления статистики в день (это должна была быть настоящая метка времени, но парень, который придумал это, был своего рода идиотом, и там слишком много данных, чтобы вернуться назад в данный момент). Поэтому некоторые идентификаторы имеют несколько строк, когда я выполняю JOIN:
SELECT user_stats.user_id, user_stats.datestamp, user_stats.post_count,
user_stats.friends_count, user_stats.favorites_count
FROM id_max_date JOIN user_stats
ON id_max_date.user_id=user_stats.user_id AND date=datestamp;
Если бы я делал это как подвыборы, я бы мог ограничиться 1, но я всегда слышал, что это ужасно неэффективно. Мысли?