2009-07-11 38 views
5

Claramente, cuando se utiliza la cláusula GROUP BY, las columnas que no son función agregada deben ser parte de la cláusula group by. El problema aquí es que no puedo contener HTTPADDRESS & columnas DATEENTERED en la cláusula GROUP BY. Además, no conozco una función que me dé las últimas entradas de todos.La columna 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

editar: Yo uso sql-server. Usaría la función LAST si estuviera usando el acceso.

SQL = "SELECT VISITORIP, HTTPADDRESS, DATEENTERED" 
SQL = SQL & " FROM STATS" 
SQL = SQL & " WHERE DATEENTERED BETWEEN '" & OnlineTime & "' AND '" & NOW() & "'" 
SQL = SQL & " GROUP BY VISITORIP" 
SQL = SQL & " ORDER BY DATEENTERED DESC" 
Set objOnVisitors = objConn.Execute(SQL)  

Respuesta

13

Tienes que volver autocombinación:

WITH LASTVISIT AS (
    SELECT VISITORIP, MAX(DATEENTERED) AS DATEENTERED 
    FROM STATS 
    WHERE DATEENTERED BETWEEN @STARTTIME AND @ENDTIME 
    GROUP BY VISITORIP 
) 
SELECT STATS.VISITORIP, STATS.HTTPADDRESS, STATS.DATEENTERED 
FROM STATS 
INNER JOIN LASTVISIT 
    ON LASTVISIT.VISITORIP = STATS.VISITORIP 
    AND LASTVISIT.DATEENTERED = STATS.DATEENTERED 
ORDER BY STATS.DATEENTERED DESC 

Nota, esto supone un determinado VISITORIP tendrá un máximo DATEENTERED único en la gama.

+0

¿Qué sucede si utilizo MAX en HTTPADDRESS y DATEENTERED directamente? –

+0

Potencialmente más incorrecto que si el IP tiene dos visitas en el mismo datetime exacto que es el último. MAX (HTTPADDRESS) y MAX (DATEENTERED) son potencialmente máximos independientes sobre el grupo. Por ejemplo, si el usuario visita http://www.abc.com/page2.htm y luego http://www.abc.com/page1.htm, la dirección máxima será la primera página, pero el tiempo máximo ser la segunda visita. –

+0

+1 no porque esto resolvió directamente mi problema, pero la idea de unirse me provocó otra idea para resolver mi problema. –

Cuestiones relacionadas