2012-10-10 15 views
5

Tengo una tabla en SQL, la tabla es la siguiente:SQL para seleccionar la lista única de usuario, junto con otros datos dependiendo de marca de tiempo

+-------------+---------------+-------------------------+ 
| quotes_user | email_address | ________Sent_at________ | 
+-------------+---------------+-------------------------+ 
| user1  | email1  | 2012-10-09 12:23:53.253 | 
| user1  | email2  | 2012-10-09 12:24:53.253 | 
| user2  | email3  | 2012-10-09 13:20:53.253 | 
| user2  | email4  | 2012-10-09 11:23:53.253 | 
| user3  | email5  | 2012-10-08 10:29:53.253 | 
| user3  | email6  | 2012-10-08 14:23:53.253 | 
+-------------+---------------+-------------------------+ 

Quiero el resultado para mostrar

+-------------+---------------+-------------------------+ 
| quotes_user | email_address | ________Sent_at________ | 
+-------------+---------------+-------------------------+ 
| user1  | email2  | 2012-10-09 12:24:53.253 | 
| user2  | email3  | 2012-10-09 13:20:53.253 | 
| user3  | email6  | 2012-10-08 14:23:53.253 | 
+-------------+---------------+-------------------------+ 

es decir, quiero seleccionar la Lista de usuarios únicos y la última dirección de correo electrónico asociada a ellos.

Otra forma de explicar el problema sería que quiero seleccionar un campo que no esté incluido en ninguna función agregada ni en una cláusula order by. He intentado muchas declaraciones con muchas permutaciones de Distinct y Order By, Group By etc., sin uso.

Estoy tratando de evitar declaraciones múltiples.

Por favor, ayúdenme con esto.

Respuesta

1

Prueba esto:

SELECT t2.quotes_user, t2.email_address, t2.Sent_at AS '________Sent_at________' 
FROM 
(
    SELECT quotes_user, MAX(Sent_at) AS MaxDate 
    FROM Table 
    GROUP BY quotes_user 
) t1 
INNER JOIN Table t2 ON t1.quotes_user = t2.quotes_user 
        AND t1.Sent_at = t2.MaxDate 
+1

Funciona como un encanto. Aunque no sé cómo funciona la parte JOIN, ¿podría orientarme hacia un buen recurso? –

+1

@SunnyRGupta - Aquí hay algunos recursos: [wikipedia - Uniones de SQL] (http://en.wikipedia.org/wiki/Join_%28SQL%29), [codificación de horror Una explicación visual de SQL se une -] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html), [Codeproject - Representación visual de SQL Join] (http://www.codeproject.com/Articles/ 33052/Visual-Representation-of-SQL-Joins). Además, recomiendo [Consultas SQL para simples mortales] (http://rads.stackoverflow.com/amzn/click/0201433362) para obtener información básica sobre consultas SQL. –

+1

Muchas gracias, el último enlace es extremadamente valioso: D –

7

La idea detrás de la consulta es obtener su máximo Sent_AT por cada quotes_user dentro de una subconsulta y volver a unirla a la tabla original.

SELECT a.* 
FROM tableName a INNER JOIN 
     (
      SELECT quotes_user, MAX(Sent_AT) maxSENT 
      FROM tableName 
      Group By quotes_user 
     ) b on a.quotes_user = b.quotes_user AND 
       a.Sent_AT = b.maxSent 

SQLFiddle Demo

+0

¿Algún problema? ¿Qué quieres saber más? –

0
select quotes_user, email_address, sent_at 
from table_name t1 inner join 
    (select quote_user, max(sent_at) as sent 
    from table_name group by quotes_uaser) t2 
on t1.quotes_user = t2.quotes_user and t1.sent_at = t2.sent 
+1

La misma respuesta que la de @Mahmoud. Por favor, evita respuestas duplicadas. –

0
select quote_user, email_adress, max(___sent_at___) from users group by quote_user 

Suponiendo que los mayores correponds sent_at con el último correo enviado.

+1

Da un error: La columna 'email_adress' no es válida en la lista de selección porque no está contenida ni en una función de agregado ni en la cláusula GROUP BY. –

+0

Lo sentimos, cambiar la cláusula group by por 'group by quote_user, email_adress' debería funcionar. –

+1

Funciona, pero no da el resultado deseado. De hecho, este fue el primer código que probé. No funcionó, por lo que se publicó aquí después de algunos intentos más. –

Cuestiones relacionadas