Выберите строку с максимальным значением в одном столбце - PullRequest
0 голосов
/ 03 марта 2012

У меня есть оператор выбора, который возвращает два столбца: названия офисов и общее количество на офис:

select o.OfficeName, c.Total
from Offices o
left join
( select OfficeID, count(*) Total
from Customers c
group by OfficeID
) c on o.OfficeID = c.OfficeID
where o.ClusterID = 29

Как я могу получить строку с максимальным итогом? Таблица «Клиенты» имеет столбец «OfficeID». Для данного «ClusterID» я выбираю все офисы в кластере, идентифицированные по идентификатору кластера (например, 29), и подсчитываю клиентов, принадлежащих этим офисам.

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

Существует несколько подходов:

SELECT  OfficeName, Total
FROM    (   SELECT  o.OfficeName, c.Total, MAX(Total) OVER() [MaxTotal]
            FROM    Offices o
                    LEFT JOIN
                    (   SELECT  OfficeID, COUNT(*) Total
                        FROM    Customers
                        GROUP BY OfficeID
                    ) c 
                        ON o.OfficeID = c.OfficeID
            WHERE   o.ClusterID = 29
        ) c
WHERE   Total = MaxTotal

ИЛИ

WITH CTE AS
(   SELECT  o.OfficeName, c.Total
    FROM    Offices o
            LEFT JOIN
            (   SELECT  OfficeID, COUNT(*) Total
                FROM    Customers
                GROUP BY OfficeID
            ) c 
                ON o.OfficeID = c.OfficeID
    WHERE   o.ClusterID = 29
)
SELECT  *
FROM    CTE
WHERE   Total = (SELECT MAX(Total) FROM CTE)

ИЛИ

SELECT  TOP 1 o.OfficeName, c.Total
FROM    Offices o
        LEFT JOIN
        (   SELECT  OfficeID, COUNT(*) Total
            FROM    Customers
            GROUP BY OfficeID
        ) c 
            ON o.OfficeID = c.OfficeID
WHERE   o.ClusterID = 29
ORDER BY Total DESC

Хотя использование TOP 1 может быть не тем, что вам нужно, другими способами, если есть 2 офиса с одинаковым количеством клиентов, они оба будут возвращены, тогда как TOP 1 вернет только 1 из них (возможно, в порядке названия офиса)).Если вам нужна только 1 запись, тогда это лучший метод

1 голос
/ 03 марта 2012

WITH TIES предлагает более понятный способ получить доступ ко всем офисам с наибольшим количеством очков:

with a as (
    select o.OfficeID,Total=COUNT(*)
    from Offices o
    inner join Customers c on c.OfficeID=o.OfficeID
    group by o.OfficeID
)
select top 1 WITH TIES t.OfficeName, a.Total
from a
inner join Offices t on t.OfficeID=a.OfficeID
where t.ClusterID=29
order by a.Total desc
1 голос
/ 03 марта 2012
SELECT TOP 1 o.OfficeName, c.Total
  FROM Offices o
  LEFT JOIN
    (SELECT OfficeID, count(*) Total
       FROM Customers c
      GROUP BY OfficeID
    ) c ON o.OfficeID = c.OfficeID
 WHERE o.ClusterID = 29
 ORDER BY c.Total DESC
...