SQL 计算多列
SQL Count multiple columns
我有一个查询目前 returns 多列,下面是一个例子。
我想要做的是计算 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
我想要的:
ClientID ServerID Last.Date ConnectionCount
1 AB 1/27/2015 2
2 DS 1/27/2015 2
我知道我需要使用 Count 函数,但问题是 Count(ClientID+ServerID) 无效,我不确定如何仅基于两列进行计数。
提前致谢
~贾森
您可以 GROUP BY
多个列,以获取每个组合的计数。
SELECT ClientID, ServerID, MAX(`Last.Date`) AS `Last.Date`, COUNT(*) AS ConnectionCount
FROM YourTable
GROUP BY ClientID, ServerID
您可以使用 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
select ClientID,ServerID,Last.Date,count(ServerID) as count
From your table
group by ServerID
您可以使用某些人所说的 self-exclusion join 对 table 自身执行外部联接,在其中排除每组匹配记录中除一条记录外的所有记录。
要进行联接,您必须首先提出联接中涉及的 table。对于您的情况,以下 select 语句将用作 table:
SELECT
ClientID
, ServerID
, count(*) as ConnectionCount
FROM Table1
GROUP BY ClientID, ServerID;
使用您的示例数据,这将产生以下结果集:
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
结合上面的table,我们构造self outer join:
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...
;
ON 子句基于您要确定每个客户端的最大服务器连接数这一事实。为此,您需要通过 ClientId 或 ON (T1.ClientId = T2.ClientId)
将 T1 中的连接计数与 T2 中的连接计数进行比较。但这不是 return 仅具有最大连接数的客户端、服务器组合的 ON 子句。为此,您必须从所有记录的 T1 连接计数大于 T2 连接计数的连接中排除记录。换句话说,不存在 T2 行,使得 T1 连接计数永远不会小于 T2 连接计数。
根据该逻辑,您可以得出以下子句:
ON (T1.ClientId = T2.ClientId AND T1.ConnectionCount < T2.ConnectionCount)
WHERE T2.ClientId IS NULL
将所有内容放在一起,最终的 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
;
我有一个查询目前 returns 多列,下面是一个例子。
我想要做的是计算 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
我想要的:
ClientID ServerID Last.Date ConnectionCount
1 AB 1/27/2015 2
2 DS 1/27/2015 2
我知道我需要使用 Count 函数,但问题是 Count(ClientID+ServerID) 无效,我不确定如何仅基于两列进行计数。
提前致谢
~贾森
您可以 GROUP BY
多个列,以获取每个组合的计数。
SELECT ClientID, ServerID, MAX(`Last.Date`) AS `Last.Date`, COUNT(*) AS ConnectionCount
FROM YourTable
GROUP BY ClientID, ServerID
您可以使用 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
select ClientID,ServerID,Last.Date,count(ServerID) as count
From your table
group by ServerID
您可以使用某些人所说的 self-exclusion join 对 table 自身执行外部联接,在其中排除每组匹配记录中除一条记录外的所有记录。
要进行联接,您必须首先提出联接中涉及的 table。对于您的情况,以下 select 语句将用作 table:
SELECT
ClientID
, ServerID
, count(*) as ConnectionCount
FROM Table1
GROUP BY ClientID, ServerID;
使用您的示例数据,这将产生以下结果集:
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
结合上面的table,我们构造self outer join:
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...
;
ON 子句基于您要确定每个客户端的最大服务器连接数这一事实。为此,您需要通过 ClientId 或 ON (T1.ClientId = T2.ClientId)
将 T1 中的连接计数与 T2 中的连接计数进行比较。但这不是 return 仅具有最大连接数的客户端、服务器组合的 ON 子句。为此,您必须从所有记录的 T1 连接计数大于 T2 连接计数的连接中排除记录。换句话说,不存在 T2 行,使得 T1 连接计数永远不会小于 T2 连接计数。
根据该逻辑,您可以得出以下子句:
ON (T1.ClientId = T2.ClientId AND T1.ConnectionCount < T2.ConnectionCount)
WHERE T2.ClientId IS NULL
将所有内容放在一起,最终的 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
;