-3

我对 SQL Server 很陌生,想知道是否可以运行这样的查询。我有一个包含以下字段的表:USER、WORKSTATION、DURATION(秒)

每个 USER 可以使用多个工作站,每个工作站可以由多个 USER 使用。

在表中,我有如下记录:

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 字段中指定。

有办法吗?我试过了,但我认为它需要嵌套查询,而且我不是很了解。谢谢!

4

3 回答 3

1

您可以分组USERWORKSTATION获取这 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];

请参阅演示

于 2022-02-03T15:03:58.077 回答
0
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
于 2022-02-03T14:47:03.170 回答
0

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

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;

这给了我们所需的结果。

于 2022-02-03T14:49:01.220 回答