2009-07-11 19 views
5

içinde yer almadığından, GROUP GROUP cümlesi kullanıldığında, toplama işlevini içermeyen sütunlar grubun bir parçası olmalıdır. Buradaki sorun, GROUP BY deyiminde HTTPADDRESS & DATEENTERED sütunlarını içeremem. Ayrıca, bana tüm son girişleri verecek bir işlev bilmiyorum.Seçim kümesinde bir toplama işlevi veya GROUP BY cümleleri

düzenleme: sql-server kullanıyorum. Erişimi kullanıyor olsaydım LAST işlevini kullanırdım.

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)  

cevap

13

Yapmalisin geri kendini katılmak:

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 

Not Bu belirli bir VISITORIP aralığında benzersiz bir maksimum DATEENTERED olacak varsayar.

+0

Doğrudan HTTPADDRESS ve DATEENTERED üzerinde MAX kullanırsam ne olur? –

+0

IP'nin, sonuncusunun aynısı olan tam datetime iki ziyareti olması olasılığından daha fazla yanlış. MAX (HTTPADDRESS) ve MAX (DATEENTERED), grup üzerinde potansiyel olarak bağımsız olarak maksimumdur. Örneğin, kullanıcı http://www.abc.com/page2.htm adresini ve ardından http://www.abc.com/page1.htm adresini ziyaret ederse, maksimum adres ilk sayfa olacaktır, ancak maksimum süre ikinci ziyaret ol. –

+0

+1 değil, bu doğrudan sorunumu çözdüğü için değil, ama kendi kendine katılma fikri benim problemimi çözmem için başka bir fikir ortaya attı. –