【问题标题】:How to display the MAX of a count如何显示计数的最大值
【发布时间】:2013-11-01 05:47:55
【问题描述】:

您好,我正在尝试编写一个查询,返回对该类别感兴趣的人数最多的类别(如果有意义的话)

所以无论如何,到目前为止,这是我的尝试......

SELECT category, MAX(catcount) FROM (
select category, catid, COUNT(id) AS catcount FROM (
SELECT  DISTINCT empinterest.id, INTERESTCATEGORY.CATID AS catid, INTERESTCATEGORY.category   FROM EMPINTEREST
INNER JOIN interest ON EMPINTEREST.INTID =  INTEREST.ID 
INNER JOIN interestcategory ON INTEREST.CATID = INTERESTCATEGORY.CATID
order by empinterest.id)
group by catid, category) GROUP BY category

我知道第一个子选择会给我类别和人们对该类别的兴趣数量,这就是为什么我试图在计数上运行一个最大值,但我认为 group by 子句是停止的原因返回的最大值。我曾尝试使用 HAVING 子句,但似乎无法正确使用语法,因此希望有人能够帮助我。提前致谢!

这里是表格,如果有帮助的话,如果有人需要进一步说明,我会提供!

CREATE TABLE department
(
dptID INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL
);


CREATE TABLE interestcategory 
(
catID INT NOT NULL PRIMARY KEY,
category VARCHAR(30) NOT NULL
);


CREATE TABLE employee (
id INT NOT NULL PRIMARY KEY,
title VARCHAR(10) NOT NULL,
fName VARCHAR(50) NOT NULL,
sName VARCHAR(50) NOT NULL,
jTitle VARCHAR(50) NOT NULL,
startDate DATE NOT NULL,
teamLead VARCHAR(50) NOT NULL,
employeeType VARCHAR(30) NOT NULL,
dptID INT NOT NULL REFERENCES department(dptID)
);


CREATE TABLE interest 
(
id INT NOT NULL PRIMARY KEY,
interest VARCHAR(50) NOT NULL,
catID INT NOT NULL REFERENCES interestcategory(catID)
  );
  CREATE TABLE empinterest 
(
id INT NOT NULL REFERENCES employee(id),
intID INT NOT NULL REFERENCES interest(id),
PRIMARY KEY (id, intID)
);

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    看看你一般是怎么做的:

    CREATE TABLE categories (
      category_id NUMBER,
      category_name VARCHAR2(20)
    );
    
    CREATE TABLE dep_table (
      category_id NUMBER
    );
    
    INSERT INTO categories VALUES (1, 'A');
    INSERT INTO categories VALUES (2, 'B');
    INSERT INTO categories VALUES (3, 'C');
    
    INSERT INTO dep_table VALUES (1);
    INSERT INTO dep_table VALUES (1);
    INSERT INTO dep_table VALUES (1);
    INSERT INTO dep_table VALUES (2);
    INSERT INTO dep_table VALUES (3);
    INSERT INTO dep_table VALUES (3);
    
    COMMIT:
    
    WITH
      main_query AS (
        SELECT ct.category_name, dt.category_id
          FROM categories ct
            JOIN dep_table dt ON (ct.category_id = dt.category_id)
      )
    SELECT category_name, COUNT(1)
      FROM main_query
    GROUP BY category_name
    HAVING COUNT(1) = (SELECT MAX(COUNT(1)) FROM main_query GROUP BY category_name);
    

    所以您的查询将如下所示:

    WITH
      main_query AS (
        SELECT
          DISTINCT
            empinterest.id,
            INTERESTCATEGORY.CATID AS catid,
            INTERESTCATEGORY.category
        FROM EMPINTEREST
          INNER JOIN interest ON EMPINTEREST.INTID =  INTEREST.ID 
          INNER JOIN interestcategory ON INTEREST.CATID = INTERESTCATEGORY.CATID
      )
    SELECT category, COUNT(1)
      FROM main_query
    GROUP BY catid, category
    HAVING COUNT(1) = (SELECT MAX(COUNT(1)) FROM main_query GROUP BY catid, category);
    

    【讨论】:

    • 非常感谢您的回答,我以前从未听说过 WITH 子句,但它确实让事情变得更容易和更整洁!能否请您解释一下 COUNT(1) 的工作原理?
    • @Jimmy COUNT 计算非 NULL 值的出现次数,因此您可以将 empinterest.id 放在此处,或者将星号 * 放在此处,或者可以基于其他列进行计数。我已经习惯于使用COUNT(1) 而不是COUNT(*),因为我读过对性能更好的地方。当您使用COUNT(1) 时,它只计算GROUP BY 子句定义的每个组中的行数。希望这足够清楚,如果没有,请询​​问。
    【解决方案2】:

    您可以执行子查询并选择第一行:

    SELECT category, catcount FROM (
      select category, catid, COUNT(id) AS catcount 
      FROM (
        SELECT
          DISTINCT empinterest.id, 
          INTERESTCATEGORY.CATID AS catid,
          INTERESTCATEGORY.category
        FROM EMPINTEREST
          INNER JOIN interest ON EMPINTEREST.INTID =  INTEREST.ID 
          INNER JOIN interestcategory ON INTEREST.CATID = INTERESTCATEGORY.CATID
        order by empinterest.id)
      group by catid, category order by catcount desc)
    WHERE ROWNUM <= 1
    

    另见this question

    唯一的麻烦是当你想获得所有满足count(id) = max(count(id))的行时,我猜你必须使用HAVING

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      相关资源
      最近更新 更多