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;
这给了我们需要的结果。
您可以按 USER
和 WORKSTATION
分组以获取这 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。
我是 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;
这给了我们需要的结果。
您可以按 USER
和 WORKSTATION
分组以获取这 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。