Ok, quindi il titolo è un po 'contorto. Questo è fondamentalmente un problema di tipo "n-per-gruppo", ma non riesco a capirlo.Postgres, tabella1 left join table2 con solo 1 riga per ID in table1
Ho una tabella, 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)
voglio ottenere le statistiche per ogni ID da ultima datestamp. Questo è un tavolo biggish, da qualche parte nel quartiere di righe 41m, così ho creato una tabella temporanea di user_id, LAST_DATE utilizza:
CREATE TEMP TABLE id_max_date AS
(SELECT user_id, MAX(datestamp) AS date FROM user_stats GROUP BY user_id);
Il problema è che datestamp non riguardano solo in quanto ci possono essere più di 1 aggiornamento delle statistiche in un giorno (avrebbe dovuto essere un vero timestamp ma il ragazzo che lo ha progettato è stato un po 'idiota e ci sono troppi dati per tornare al momento). Così alcuni ID hanno più righe quando faccio la registrazione:
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;
Se stavo facendo questo come subselect Credo che potrebbe limitare 1, ma ho sempre sentito dire quelli sono terribilmente inefficiente. Pensieri?
"... Ho sempre sentito dire che sono orribilmente inefficienti." Non farti risucchiare dal culto del carico! 'SPIEGAZIONE' è tuo amico! Provalo e scopri cosa può fare l'ottimizzatore di query per te. – Charles