2010-04-15 5 views
0

질문 : 브라우저 통계를 수집하는 웹 사이트가 있습니다. User_UID 고유 식별자
,
날짜 Visit_DateTime,
플로트 Screen_w,
,
고유 식별자 Visit_UID : 따라서

, 나는 다음과 같은 열이, SQL 테이블 (T_Visits)가 float Screen_h,
플로트 해상도 = Screen_w * Screen_h
VARCHAR resolutionstring = screen_w +는 'X'+ screen_h


사용자가 여러 컴퓨터에서 사이트를 방문 할 수 있기 때문에, 각 방문 화면 크기에서 다른 항목이 될 수 있습니다 같은 사용자. 내가 해당 해상도 문자열을 얻을 수있는 방법
최대 허용 그룹으로 화면 해상도

Select User_UID, max(resolution) from T_Visits GROUP BY User_UID 



:
는 지금은 각 사용자가 가지고있는 최대/최소 해상도를 얻으려면?
은 내가 최대 (screen_w) 및 최대 (screen_h)을 얻을 수 있음을 의미하지만, 'X'+ 최대 + 해당 resolutionstring이 최대가 될 것이라고 보장 (screen_w) (screen_h는)

+1

둘 이상의 화면 크기에서 최대 해상도가 생성되는 예상 검색어 동작은 어떻게됩니까? 예 : 800x600 및 1000x480은 모두 동일한 제품을 제공합니다. 어느 제품을보고 할 것인가? 아니면 둘 다 보여줄 것입니까? –

+0

당신은 요점에 저를 이겼습니다 :) –

+0

@Ed Harper : 좋은 질문입니다. 어떤 것이지, 하나만은 중요하지 않습니다. 나는 그것이 내가 더 관심이있는 것이기 때문에 나는 폭으로 갈 것이라고 말하고 싶다. –

답변

1

같은 것을보십시오. ROWNUMBER()이 아닌 원하는 경우 RANK()을 사용하도록 쿼리를 수정할 수 있습니다.

편집 최대/최소 해상도 화면 너비

이 최대 해상도의 문자열로 User_UID의 목록을 얻기 위해 일해야
0
SELECT DISTINCT T_Visits.User_UID, T_Visits.Resolution, T_Visits.resolutionstring 
FROM T_Visits 
    INNER JOIN (SELECT User_UID, max(resolution) AS max 
       FROM T_Visits 
       GROUP BY User_UID) temp 
      ON T_Visits.User_UID = temp.User_UID 
      AND T_Visits.Resolution = temp.max 

이 쿼리가 없습니다 먼저 각 사용자 ID와 최대 해상도의 임시 테이블을 만든 다음 사용자 ID 및 해상도 필드와 일치하는 T_Visits 테이블의 내부 조인을 사용하여 해당 해상도 문자열을 제공해야합니다.

그러나 이러한 종류의 쿼리에는 몇 가지 문제점이 있습니다. 먼저 DISTINCT는 동일한 resolutionstring에 대해 반환되는 여러 행을 처리하지만 동일한 해상도의 여러 모니터가있는 경우 사용자 당 여러 행을 반환해야합니다. 예를 들어, 누군가 iPhone을 사용하여 사이트를 방문하고 320x480의 히트를 기록했지만 휴대 전화를 옆으로 돌려 사이트가 다시 방문하면 X와 Y 값이 정위. 이렇게하면 resolutionstring 초마다 여러 개의 최대 해상도가 생성됩니다.

모니터에서도 동일한 현상이 발생할 수 있습니다. 문서 편집자가 모니터를 회전시켜보다 "합법적 인 용지"스타일로 볼 수있는 것은 흔한 일입니다. 그러나 가정에서 귀하의 사이트를 방문 할 때 동일한 설정을하지는 않았지만 동일한 해상도를 유지할 수 있습니다.

정확히 어떤 경우 쿼리를 반환 하시겠습니까? 이것은 당신이 관계없이 하나 이상되는 H ×이 동일한 해상도를 제공하는지 여부, 사용자 ID 당 1 개 행을 표시 할 가정합니다

;WITH resCTE 
AS 
(
     SELECT User_UID 
       ,resolutionstring 
       ,ROW_NUMBER() OVER (PARTITION BY User_UID 
            ORDER BY Resolution desc 
              ,Screen_w desc 
           ) AS rnMax 
       ,ROW_NUMBER() OVER (PARTITION BY User_UID 
            ORDER BY Resolution 
              ,Screen_w 
           ) AS rnMin       
) 
SELECT maxr.User_UID 
     ,maxr.resolutionstring AS maxRes 
     ,minr.resolutionstring AS minRes 
FROM resCTE AS maxr 
JOIN resCTE AS minr 
ON minr.User_UID = maxr.User_UID 
AND minr.rnMin = 1 
WHERE maxr.rnMax = 1 

(안된) :

+0

@NickLarsen : 스와핑. 결코 이것을 생각하지 않았습니다. 매우 성가신, 정적으로 더 이상 CSS를 설정할 수 없습니다. –

0

으로 하위 분류를 보여주기 위해 개정

. 모든 최소 해상도를 얻으려면 그것을 적용하십시오. 아마도 가장 효율적인 방법이 아닐 수도 있습니다 ...

+0

사용자가 최대 (해상도)로 두 번 방문하면 user_uid 측에서 조금 비 고유하지 않습니까? 줄을 따라 생각하고 있었다 T_Visits의 MaxResolutionString에서 User_UID, 최대 (해상도), (해상도 (T_Vistis에서 user_UID = User_UID 순서로 최상위 (1) 해상도 스트링을 선택) GROUP BY User_UID –