Получение макс. разрешение экрана с Group By - PullRequest
0 голосов
/ 15 апреля 2010

Вопрос. У меня есть веб-сайт, на котором я собираю статистику браузера.Таким образом, у меня есть таблица SQL (T_Visits) со следующими столбцами:
uniqueidentifier Visit_UID, уникальный идентификатор User_UID, datetime Visit_DateTime, float Screen_w, float Screen_h, float Разрешение = Screen_w * Screen_h varchar resolutionstring = screen_w + 'x' + screen_hПоскольку пользователь может посещать сайт с нескольких компьютеров, для каждого посещения одного и того же пользователя могут быть разные записи в размерах экрана.Теперь я хочу получить максимальное / минимальное разрешение каждого пользователя:

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

Как я могу получить соответствующую строку разрешения?Я имею в виду, что могу получить max (screen_w) и max (screen_h), но нет никакой гарантии, что соответствующая строка разрешения будет max (screen_w) + 'x' + max (screen_h)

Ответы [ 3 ]

1 голос
/ 15 апреля 2010

Попробуйте что-то вроде:

;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

(непроверенные)

Обратите внимание, что при этом предполагается, что вы хотите видеть только 1 строку для каждого идентификатора пользователя, независимо от того, дает ли несколько HxW одинаковое разрешение. Можно было бы изменить запрос, чтобы использовать RANK() вместо ROWNUMBER(), если это не то поведение, которое вам нужно.

EDIT

Изменено отображение максимального / минимального разрешения, отсортированного по ширине экрана

0 голосов
/ 15 апреля 2010

Это должно работать, чтобы получить список User_UID со строкой максимального разрешения. Приспособьте это, чтобы получить все минимальные разрешения. Возможно, это не самый эффективный способ ...

Select User_UID, resolutionstring from T_Visits as p
WHERE resolution = (Select max(resolution) from T_Visits where User_UID =p.User_UID)
0 голосов
/ 15 апреля 2010
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

Этот запрос сначала создает временную таблицу с идентификатором каждого пользователя и максимальным разрешением, а затем внутреннюю объединяет ее с таблицей T_Visits, совпадающей с полями идентификатора пользователя и разрешения, что должно дать вам соответствующие строки разрешения.

Однако с этим типом запроса есть некоторые проблемы. Прежде всего, хотя DISTINCT заботится о том, чтобы несколько строк возвращались для одного и того же resolutionstring, он все равно должен возвращать несколько строк на пользователя, если у них есть несколько мониторов с одинаковым разрешением. Например, что если кто-то заходит на ваш сайт с iPhone, и вы записываете попадание с разрешением 320x480, но затем они поворачивают свой телефон вбок и снова обращаются к вашему сайту, который теперь должен зарегистрировать 480x320, потому что его значения X и Y теперь поменялись местами из-за ориентации. Это приведет к нескольким попаданиям с максимальным разрешением с разными resolutionstring с.

То же самое может случиться с мониторами. Редакторы документов нередко поворачивают свои мониторы для более «легального» представления в стиле. Однако, когда они посещают ваш сайт из своих домов, они могут не иметь такой же настройки, но имеют одинаковое разрешение.

Что именно вы хотите, чтобы ваш запрос возвращал, если это так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...