Группа запросов SQL для начинающих

Я новичок в SQL Server, и мне было интересно, можно ли выполнить такой запрос. У меня есть таблица со следующими полями: ПОЛЬЗОВАТЕЛЬ, РАБОЧАЯ СТАНЦИЯ, ПРОДОЛЖИТЕЛЬНОСТЬ (секунды)

Каждый ПОЛЬЗОВАТЕЛЬ может использовать несколько рабочих станций, и каждая рабочая станция может использоваться несколькими ПОЛЬЗОВАТЕЛЯМИ.

В таблице у меня есть записи типа:

      USER1 - WKS1 - 6500
USER1 - WKS2 - 3600
USER1 - WKS2 - 1200
USER1 - WKS2 - 1200
USER1 - WKS3 - 3600
USER2 - WKS1 - 8500
USER2 - WKS2 - 1000
USER2 - WKS2 - 8000
...
...

Я хотел бы получить результат, который группирует пользователя и наиболее часто используемую рабочую станцию, например:

      USER1 - WKS1
USER2 - WKS2
...
...

Как указано в поле ПРОДОЛЖИТЕЛЬНОСТЬ в секундах.

Есть способ? Я пробовал, но думаю, что для этого нужны вложенные запросы, а я не очень хорошо разбираюсь. Спасибо!

3 ответа

Вы можете сгруппировать по и получить общую продолжительность для каждой комбинации этих 2 столбцов и с FIRST_VALUE()оконная функция получает значение WORKSTATIONс максимальной продолжительностью для каждого USER:

      SELECT DISTINCT [USER], 
       FIRST_VALUE([WORKSTATION]) OVER (PARTITION BY [USER] ORDER BY SUM([DURATION]) DESC) [WORKSTATION]
FROM tablename
GROUP BY [USER], [WORKSTATION];

Смотрите демо.

Подумайте об этом так. Вам нужен пользователь и рабочая станция, на которой он провел больше всего времени. Когда дело доходит до продолжительности, самая длинная является синонимом максимальной. Итак, нам нужна максимальная продолжительность для пользователя.

      SELECT user, MAX(duration) AS max_duration
FROM the_table
GROUP BY user;

Это дает нам максимальную продолжительность для пользователя.

Затем мы хотим определить, какая рабочая станция имеет это значение (max_duration) в столбце продолжительности. Итак, мы используем запрос выше в качестве фильтра для другого запроса:

      SELECT x.user, x.workstation, x.duration
FROM the_table x
INNER JOIN (SELECT user, MAX(duration) AS max_duration
            FROM the_table
            GROUP BY user) y 
            ON x.user = y.user AND x.duration = y.max_duration;

Это дает нам требуемый результат.

      with cte as (
    Select User, 
           Workstation, 
           Max(Duration) as Duration
    from TableName
    group by User, 
             Workstation 
) 
select User, Workstation
from cte
order by User, Workstation
Другие вопросы по тегам