Пост-ГРЭС, table1 оставленный соединение table2 только с 1 строкой на идентификатор в table1

Хорошо, таким образом, заголовок является немного замысловатым. Это - в основном проблема типа greatest-n-per-group, но я не могу ни за что в жизни понять это.

У меня есть таблица, 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);

Проблема состоит в том, что метка даты не уникальна, так как может быть больше чем 1 обновление статистики через день (должна была быть реальная метка времени, но парень, который разработал, это было видом идиота и существует слишком много данных для возвращения в данный момент). Таким образом, некоторые идентификаторы имеют несколько строк, когда я делаю СОЕДИНЕНИЕ:

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, но я всегда слышал, что это ужасно неэффективно. Мысли?

5
задан Peck 22 July 2010 в 04:09
поделиться