我有一个当前返回多个列的查询,下面是一个示例.
我想要做的是计算ClientID和ServerID配对的次数.我希望获得最多服务于该客户端的ServerID.
ClientID, ServerID, Last.Date
1 AB 1/27/2015
2 DS 1/27/2015
1 JK 1/27/2015
1 AB 1/24/2015
2 PD 1/24/2015
2 DS 1/23/2015
Run Code Online (Sandbox Code Playgroud)
我想要的是:
ClientID ServerID Last.Date ConnectionCount
1 AB 1/27/2015 2
2 DS 1/27/2015 2
Run Code Online (Sandbox Code Playgroud)
我知道我需要使用Count函数,但问题是Count(ClientID + ServerID)无效,我不确定如何基于两列计数.
提前谢谢
〜贾森
您可以使用GROUP BY多个列来获取每个组合的计数.
SELECT ClientID, ServerID, MAX(`Last.Date`) AS `Last.Date`, COUNT(*) AS ConnectionCount
FROM YourTable
GROUP BY ClientID, ServerID
Run Code Online (Sandbox Code Playgroud)
您可以使用group by并获得最大连接数,然后group by在客户端上再做一个,以获得服务最多的服务器
SELECT clientId, serverId,
max(connectionCount) as ConnectionCount, LastDate
from
(
select clientId, ServerID,
count(*) as ConnectionCount,
max(LastDate) as LastDate
from Table1
group by clientId, ServerID
) t
group by clientId
Run Code Online (Sandbox Code Playgroud)
您可以使用所谓的自我排除联接,即在表上对其自身执行外部联接,在该联接中您排除每组匹配记录中除一个记录外的所有记录。
要进行联接,您必须首先提供联接所涉及的表。对于您的情况,以下选择语句将用作表:
SELECT
ClientID
, ServerID
, count(*) as ConnectionCount
FROM Table1
GROUP BY ClientID, ServerID;
Run Code Online (Sandbox Code Playgroud)
使用示例数据,将得到以下结果集:
ClientID ServerID LastDate ConnectionCount
1 AB 1/27/2015 2
2 DS 1/27/2015 2
1 JK 1/27/2015 1
2 PD 1/24/2015 1
Run Code Online (Sandbox Code Playgroud)
通过上表,我们构造了自我外部联接:
SELECT T1.* FROM
( SELECT
ClientID
, ServerID
, max(LastDate) as LastDate
, count(*) as ConnectionCount
FROM Table1
GROUP BY ClientID, ServerID
) T1
LEFT JOIN
( SELECT
ClientID
, ServerID
, count(*) as ConnectionCount
FROM Table1
GROUP BY ClientID, ServerID
) T2
ON (...some on clause...)
WHERE ...some where clause...
;
Run Code Online (Sandbox Code Playgroud)
ON子句基于您要确定每个客户端的最大服务器连接数的事实。为此,您需要通过ClientId或T1将T1中的连接计数与T2中的连接计数进行比较ON (T1.ClientId = T2.ClientId)。但这还不足以仅返回具有最大连接数的客户端,服务器组合的ON子句。为此,必须从联接中排除所有记录的T1连接计数大于T2连接计数的记录。换句话说,不存在T2行,因此T1连接数永远不会小于T2连接数。
通过这种逻辑,您可以提出以下子句:
ON (T1.ClientId = T2.ClientId AND T1.ConnectionCount < T2.ConnectionCount)
WHERE T2.ClientId IS NULL
Run Code Online (Sandbox Code Playgroud)
将所有内容放在一起,最终的SQL查询为:
SELECT T1.* FROM
( SELECT
ClientID
, ServerID
, max(LastDate) as LastDate
, count(*) as ConnectionCount
FROM Table1
GROUP BY ClientID, ServerID
) T1
LEFT JOIN
( SELECT
ClientID
, ServerID
, count(*) as ConnectionCount
FROM Table1
GROUP BY ClientID, ServerID
) T2
ON (T1.ClientId = T2.ClientId AND T1.ConnectionCount < T2.ConnectionCount)
WHERE T2.ClientId IS NULL
;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33469 次 |
| 最近记录: |