需要使用DISTINCT,COUNT,MAX的数据列表

时间:2018-10-03 07:18:05

标签: mysql sql

表结构如下,

enter image description here

我的第一个SQL查询如下,

SELECT DISTINCT(IndustryVertical)
     , COUNT(IndustryVertical) AS IndustryVerticalCount
     , City 
  FROM `records` 
 WHERE City!='' 
 GROUP 
    BY IndustryVertical
     , City 
 ORDER 
    BY `IndustryVerticalCount` DESC

通过运行以上查询,我得到了以下内容,

enter image description here

我要实现的目标是获得所有DISTINCT CITY的列表,且仅包含一个MAX(IndustryVerticalCount)和IndustryVertical。

尝试了几件事,没有希望。

任何人,请引导我。

每个城市值中都有几条记录。我想要实现的是得到,

  1. 所有不同的城市价值
  2. 行业最多的垂直数量
  3. 行业名称垂直

我得到的记录如下, enter image description here

我想要得到的, enter image description here

以上记录仅供参考。在这里,您只能看到不同的城市值,只有一个垂直名称具有最大数量。

3 个答案:

答案 0 :(得分:0)

由于您使用分组依据,因此它将仅自动选择不同的行。由于您在两列上使用分组依据,因此您将获得其中只有两列组合是唯一的行。

您现在要做的是使用此结果表,并对其进行查询以找到按城市分组的最大计数。

    SELECT IndustryVertical, IndustryVerticalCount, City from 
   ( SELECT IndustryVertical
     , COUNT(IndustryVertical) AS IndustryVerticalCount
     , City 
  FROM `records` 
 WHERE City!='' 
 GROUP 
    BY IndustryVertical
     , City) as tbl where IndustryVerticalCount IN (Select max(IndustryVerticalCount) from ( SELECT IndustryVertical
     , COUNT(IndustryVertical) AS IndustryVerticalCount
     , City 
  FROM `records` 
 WHERE City!='' 
 GROUP 
    BY IndustryVertical
     , City) as tbl2 where tbl.City=tbl2.city)

这可能不是最有效的方法,但我认为它会起作用。

答案 1 :(得分:0)

这个怎么样?我认为应该起作用:

DECLARE @DataSet TABLE (
    City VARCHAR(50),
    IndustryVertical VARCHAR(50),
    IndustryVerticalCount INT
)

INSERT INTO @DataSet SELECT 'Bangalore', 'Consumer Internet', 279
INSERT INTO @DataSet SELECT 'Bangalore', 'Technology', 269
INSERT INTO @DataSet SELECT 'Bangalore', 'Logistics', 179
INSERT INTO @DataSet SELECT 'Mumbai', 'Technology', 194
INSERT INTO @DataSet SELECT 'Mumbai', 'Consumer Internet', 89


SELECT 
    table_a.* 
FROM @DataSet table_a
LEFT JOIN @DataSet table_b 
    ON table_a.City = table_b.City
    AND table_a.IndustryVerticalCount < table_b.IndustryVerticalCount
WHERE table_b.IndustryVerticalCount IS NULL

答案 2 :(得分:0)

我认为您只是想要一个HAVING子句:

SELECT r.IndustryVertical,
       COUNT(*) AS IndustryVerticalCount,
       r.City 
FROM records r
WHERE r.City <> ''
GROUP BY r.IndustryVertical, r.City 
HAVING COUNT(*) = (SELECT COUNT(*)
                   FROM records r2
                   WHERE r2.City = r.City
                   ORDER BY COUNT(*) DESC
                   LIMIT 1
                  )
ORDER BY IndustryVerticalCount DESC;