2015-01-30 3 views
0

У меня есть запрос, который возвращает несколько столбцов в настоящее время, ниже приведен пример.SQL Count несколько столбцов

То, что я хочу сделать, - это подсчет количества пар 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 код_сервер Last.Date ConnectionCount

1   AB  1/27/2015 2 
2   DS  1/27/2015 2 

Я знаю, что нужно использовать функцию Count, но вопрос Count (ClientID + код_сервер) недействительно, и я не уверен, как рассчитывать только на двух столбцах.

Благодаря загодя

~ Jason

+0

Итак, вы хотите подсчет комбинации идентификатора клиента и идентификатор сервера? –

+0

Вы можете сгруппировать запрос serverid. Примером агрегации групп является. mysql> SELECT student_name, AVG (test_score) -> FROM student -> GROUP BY student_name; просто замените avg на количество или что-то подобное – qamar

+0

Почему вы выбрали 1/27/2015 для спаривания '1, AB', более 1/24/2015. Вы тоже хотите «MAX (Last.Date)»? – mjsqu

ответ

0

вы можете использовать group by и получить максимальное число соединений, а затем дополнительно сделать более group by один на клиенте, чтобы получить сервер, который обслуживает самый

SQL Fiddle

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 
+0

Радар, это очень помогло. –

+1

Вторая группа недостаточна, так как она не вернет сервер с максимальным количеством подключений. Он просто возвращает первый сервер для каждого клиента. Чтобы проверить, добавьте две записи с клиентом 1 и сервером JK в конце данных. Выполнение запроса по-прежнему приводит к тому, что AB является максимальным для клиента 1, когда он явно JK. http://sqlfiddle.com/#!2/2e872/1 –

6

Вы можете GROUP BY несколько столбцов, чтобы получить количество каждой комбинации.

SELECT ClientID, ServerID, MAX(`Last.Date`) AS `Last.Date`, COUNT(*) AS ConnectionCount 
FROM YourTable 
GROUP BY ClientID, ServerID 
+0

Спасибо Barmar, это сработало, но проблема, с которой я сталкиваюсь, заключается в том, что это не выполняется на одной таблице. Я пытаюсь добавить это в запрос, который у меня уже запущен, который спамает несколько таблиц и уже имеет GROUP BY. Я пытаюсь выяснить, как это сделать в середине запроса. Я чувствую, что это близко к тому, что я ищу. –

+0

Возможно, вам просто нужно поставить это как подзапрос вместо 'YourTable'. Но я просто догадываюсь. Обновите вопрос и покажите, что вам действительно нужно, я не читатель ума. – Barmar

+0

Barmar, Спасибо, я посмотрел, как положить его в подзапрос, и, похоже, он работает. –

0
select ClientID,ServerID,Last.Date,count(ServerID) as count 
From your table 
group by ServerID 
3

Вы можете использовать то, что некоторые называют 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 
; 
Смежные вопросы