2009-07-11 14 views
5

GROUP BY句を使用すると、集計関数ではない列がgroup by句の一部になるはずです。ここでの問題は、HTTPADDRESS & DATEENTERED列をGROUP BY句に含めることができないことです。また、私はすべての最新のエントリを私に与える機能を知らない。集計関数またはGROUP BY句に含まれていないため、選択リストで列が無効です

私はsql-serverを使用しています。私はアクセスを使用していた場合、LAST関数を使用します。自己結合バックにあなたが持っている

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)  

答えて

13

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 

注、これは与えられたVISITORIPが範囲内に独自の最大DATEENTEREDを持っています前提としています。

+0

HTTPADDRESSとDATEENTEREDでMAXを直接使用するとどうなりますか? –

+0

IPが最後の同じ正確な日時に2回訪問した場合よりも潜在的に不正確です。 MAX(HTTPADDRESS)とMAX(DATEENTERED)は、グループに対して潜在的に独立して最大である可能性があります。たとえば、ユーザーがhttp://www.abc.com/page2.htmを訪問してからhttp://www.abc.com/page1.htmを訪問すると、最大アドレスが最初のページになりますが、最大時間は2回目の訪問です。 –

+0

+1これは私の問題を直接解決したからではありませんが、自己結合のアイデアは私の問題を解決するための別のアイデアを引き起こしました。 –

関連する問題