Вы можете использовать то, что некоторые называют self-exclusion join, где вы выполняете внешнее соединение на таблицу, где вы исключаете все записи, кроме одной, для каждого набора совпадающих записей.
Чтобы сделать соединение, вы должны сначала придумать таблицу, которая участвует в соединении. В вашем случае, следующий оператор выбора будет служить в качестве таблицы:
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
С приведенной выше таблице, мы построим само внешнее соединение:
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...
;
положение ВКЛ основано на том факте, который вы хотите определить подсчитывать максимальное соединение с сервером для каждого клиента. Для этого вам нужно сравнить количество подключений в T1 с подсчетами подключений в T2 по ClientId или 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
Сложив все вместе, окончательный 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
;
Итак, вы хотите подсчет комбинации идентификатора клиента и идентификатор сервера? –
Вы можете сгруппировать запрос serverid. Примером агрегации групп является. mysql> SELECT student_name, AVG (test_score) -> FROM student -> GROUP BY student_name; просто замените avg на количество или что-то подобное – qamar
Почему вы выбрали 1/27/2015 для спаривания '1, AB', более 1/24/2015. Вы тоже хотите «MAX (Last.Date)»? – mjsqu