2009-07-11 32 views
5

Rõ ràng, khi mệnh đề GROUP BY được sử dụng, cột không phải là hàm tổng hợp phải là một phần của nhóm theo mệnh đề. Vấn đề ở đây là, tôi không thể chứa các cột HTTPADDRESS & DATEENTERED trong mệnh đề GROUP BY. Ngoài ra, tôi không biết một chức năng mà sẽ cho tôi những mục mới nhất của tất cả.Cột không hợp lệ trong danh sách lựa chọn vì nó không được chứa trong hàm tổng hợp hoặc mệnh đề GROUP BY

chỉnh sửa: Tôi sử dụng máy chủ sql. Tôi sẽ sử dụng hàm LAST nếu tôi đang sử dụng quyền truy cập.

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)  

Trả lời

13

Bạn phải tự tham gia trở lại:

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 

Lưu ý, điều này giả định một VISITORIP nhất định sẽ có một DATEENTERED tối đa duy nhất trong phạm vi.

+0

Nếu tôi sử dụng MAX trên HTTPADDRESS và DATEENTERED trực tiếp thì sao? –

+0

Có khả năng không chính xác hơn nếu IP có hai lượt truy cập vào cùng một ngày giờ chính xác là ngày cuối cùng của chúng. MAX (HTTPADDRESS) và MAX (DATEENTERED) có khả năng độc lập tối đa trong nhóm. Ví dụ: nếu người dùng truy cập http://www.abc.com/page2.htm và sau đó http://www.abc.com/page1.htm, địa chỉ tối đa sẽ là trang đầu tiên, nhưng thời gian tối đa sẽ là chuyến thăm thứ hai. –

+0

+1 không phải vì điều này giải quyết trực tiếp vấn đề của tôi, nhưng ý tưởng tự tham gia đã tạo ra một ý tưởng khác cho tôi để giải quyết vấn đề của tôi. –

Các vấn đề liên quan