SQL 初学者查询分组依据

SQL Query group by for a beginner

我是 SQL 服务器的新手,想知道是否可以 运行 这样的查询。 我有一个包含以下字段的 table:USER、WORKSTATION、DURATION(秒)

每个用户可以使用多个工作站,每个工作站可以被多个用户使用。

在 table 我有这样的记录:

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
...
...

如 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

这样想。您需要用户和他们花费时间最长的工作站。说到持续时间,最长与最长是同义词。所以,我们想要用户的最大持续时间。

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;

这给了我们需要的结果。

您可以按 USERWORKSTATION 分组以获取这 2 列的每个组合的总持续时间,并使用 FIRST_VALUE() window 函数获取 WORKSTATION 每个 USER:

的最高持续时间
SELECT DISTINCT [USER], 
       FIRST_VALUE([WORKSTATION]) OVER (PARTITION BY [USER] ORDER BY SUM([DURATION]) DESC) [WORKSTATION]
FROM tablename
GROUP BY [USER], [WORKSTATION];

参见demo