2009-07-11 13 views
5

Oczywiście, gdy użyto klauzuli GROUP BY, kolumny, które nie są funkcją agregującą, powinny być częścią klauzuli group by. Problem polega na tym, że nie mogę zawierać kolumn HTTPADDRESS & DATEENTERED w klauzuli GROUP BY. Ponadto, nie znam funkcji, która da mi najnowsze wpisy wszystkich.Kolumna jest nieprawidłowa na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej ani w klauzuli GROUP BY

edytuj: Używam serwera sql. Chciałbym użyć funkcji LAST, jeśli korzystałem z dostępu.

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)  

Odpowiedz

13

Trzeba samosprzężenie powrotem:

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 

Uwaga ta zakłada dana VISITORIP będą mieli niepowtarzalną maksymalną DATEENTERED w przedziale.

+0

Co zrobić, jeśli używam MAX na HTTPADDRESS i DATEENTERED bezpośrednio? –

+0

Potencjalnie bardziej niepoprawny niż w przypadku, gdy adres IP ma dwie wizyty na tej samej dokładnej wartości daty i godziny, która jest ostatnia. MAX (HTTPADDRESS) i MAX (DATEENTERED) są potencjalnie niezależnie maksymalne w grupie. Na przykład, jeśli użytkownik odwiedza http://www.abc.com/page2.htm, a następnie http://www.abc.com/page1.htm, maksymalny adres będzie pierwszą stroną, ale maksymalny czas będzie być drugą wizytą. –

+0

+1 nie dlatego, że rozwiązało to bezpośrednio mój problem, ale pomysł na łączenie się stał się dla mnie kolejnym pomysłem na rozwiązanie mojego problemu. –

Powiązane problemy