Ok, entonces el título es un poco intrincado. Este es básicamente un problema de tipo "n-por-grupo", pero no puedo por la vida de mi entenderlo.Postgres, table1 left join table2 con solo 1 fila por ID en table1
Tengo una tabla, 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)
quiero conseguir las estadísticas para cada ID de marca de fecha más reciente. Esta es una tabla bastante grande, en algún lugar en el barrio de filas 41m, así que he creado una tabla temporal de user_id, last_date usando:
CREATE TEMP TABLE id_max_date AS
(SELECT user_id, MAX(datestamp) AS date FROM user_stats GROUP BY user_id);
El problema es que la marca de fecha no es única ya que puede haber más de 1 actualización de estadísticas en un día (debería haber sido una marca de tiempo real, pero el tipo que diseñó esto era un poco idiota y hay demasiados datos para regresar en este momento). Por lo que algunos identificadores tienen varias filas cuando lo haga el Ingreso:
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;
Si yo estaba haciendo esto como subselects supongo que podría limitar 1, pero siempre he oído esas son terriblemente ineficiente. ¿Pensamientos?
"... Siempre escuché que son horriblemente ineficientes". ¡No te dejes absorber por el culto a la carga! 'EXPLAIN' es tu amigo! Pruébelo y descubra lo que el optimizador de consultas puede hacer por usted. – Charles