SQL 查询 MAX(SUM(..))
SQL query MAX(SUM(..))
表结构:
Article(
model int(key),
year int(key),
author varchar(key),
num int)
num: 一年内写的文章数
找到所有作者,他们中的每个人在一年内至少写了最大数量的文章(相对于所有其他作者)
我试过了:
SELECT author FROM Article,
(SELECT year,max(sumnum) s FROM
(SELECT year,author,SUM(num) sumnum FROM Article GROUP BY year,author)
GROUP BY year) AS B WHERE Article.year=B.year and Article.num=B.s;
这是正确答案吗?
谢谢
您可能想尝试自我JOIN
来获得您想要的东西:
SELECT Main.author
FROM Article AS Main
INNER JOIN (
SELECT year
,author
,SUM(num) AS sumnum
FROM Article
GROUP BY year
,author
) AS SumMain
ON SumMain.year = Main.year
AND SumMain.author = Main.author
GROUP BY Main.author
HAVING SUM(Main.num) = MAX(SumMain.sumnum)
;
这将保证(因为它是 ANSI)您将获得 SUM
med num
的 MAX
,并且只返回您需要的结果。请记住,由于提供的信息,我只对这两个字段进行了 JOIN
编辑...如果您有唯一的 ID,则可以 JOIN
,或者您需要更具体的信息才能获得一对一1场比赛,相应调整。
根据您使用的 DBMS,可以通过以下两种方式之一进行简化:
SELECT author
FROM (
SELECT year
,author
,SUM(num) AS sumnum
FROM Article
GROUP BY year
,author
HAVING SUM(num) = MAX(sumnum)
) AS Main
;
一些 DBMS 允许您执行多个聚合函数,这可以在那里工作。
如果您的 DBMS 允许您执行 OLAP 功能,您可以这样做:
SELECT author
FROM (
SELECT year
,author
,SUM(num) AS sumnum
FROM Article
GROUP BY year
,author
) AS Main
QUALIFY (
ROW_NUMBER() OVER (
PARTITION BY author
,year
ORDER BY sumnum DESC
) = 1
)
;
这会将结果集限制为最高 sumnum
,但如果您希望 year
参与进来,您可能需要更多参数来处理事情(您是 GROUP
通过它,我提出它的唯一原因)。
希望对您有所帮助!
您提到作业和有效尝试,但不正确。
这是在模型列类似于自动递增的前提下(不清楚,因为没有示例数据),并且每个作者每年只会有一个条目,并且同一作者不会有多个记录同年。例如:
model year author num
===== ==== ====== ===
1 2013 A 15
2 2013 C 18
3 2013 X 17
4 2014 A 16
5 2014 B 12
6 2014 C 16
7 2014 X 18
8 2014 Y 18
因此预期的结果是 2013 年的最高文章数 = 18,并且只有 return 作者 "C"。 2014 年,文章数量最多为 18 篇,return 作者 "X" 和 "Y"
首先,查询文章的最大写入数量是多少...
select
year,
max( num ) as ArticlesPerYear
from
Article
GROUP BY
year
这将为您提供每年一条记录,以及发表文章的最大数量...因此,如果您有 2010-2014 年的数据,您最多会有 5 条记录 returned。现在,只需将其加入具有匹配年份和文章
的原始 table
select
A2.*
from
( select
year,
max( num ) as ArticlesPerYear
from
Article
GROUP BY
year ) PreQuery
JOIN Article A2
on PreQuery.Year = A2.Year
AND PreQuery.ArticlesPerYear = A2.num
我建议 CTE
WITH maxyear AS
(SELECT year, max(num) AS max_articles
FROM article
GROUP BY year)
SELECT DISTINCT author
FROM article a
JOIN maxyear m
ON a.year=m.year AND a.num=m.max_articles;
并将其性能与分区进行比较,这是另一种方式
SELECT DISTINCT author FROM
(SELECT author, rank() AS r
OVER (PARTITION BY year ORDER BY num DESC)
FROM article) AS subq
WHERE r = 1;
我想有些 RDBMS 会让你把 HAVING rank()=1
放在子查询上,然后你就不需要嵌套查询了。
表结构:
Article(
model int(key),
year int(key),
author varchar(key),
num int)
num: 一年内写的文章数
找到所有作者,他们中的每个人在一年内至少写了最大数量的文章(相对于所有其他作者)
我试过了:
SELECT author FROM Article,
(SELECT year,max(sumnum) s FROM
(SELECT year,author,SUM(num) sumnum FROM Article GROUP BY year,author)
GROUP BY year) AS B WHERE Article.year=B.year and Article.num=B.s;
这是正确答案吗? 谢谢
您可能想尝试自我JOIN
来获得您想要的东西:
SELECT Main.author
FROM Article AS Main
INNER JOIN (
SELECT year
,author
,SUM(num) AS sumnum
FROM Article
GROUP BY year
,author
) AS SumMain
ON SumMain.year = Main.year
AND SumMain.author = Main.author
GROUP BY Main.author
HAVING SUM(Main.num) = MAX(SumMain.sumnum)
;
这将保证(因为它是 ANSI)您将获得 SUM
med num
的 MAX
,并且只返回您需要的结果。请记住,由于提供的信息,我只对这两个字段进行了 JOIN
编辑...如果您有唯一的 ID,则可以 JOIN
,或者您需要更具体的信息才能获得一对一1场比赛,相应调整。
根据您使用的 DBMS,可以通过以下两种方式之一进行简化:
SELECT author
FROM (
SELECT year
,author
,SUM(num) AS sumnum
FROM Article
GROUP BY year
,author
HAVING SUM(num) = MAX(sumnum)
) AS Main
;
一些 DBMS 允许您执行多个聚合函数,这可以在那里工作。
如果您的 DBMS 允许您执行 OLAP 功能,您可以这样做:
SELECT author
FROM (
SELECT year
,author
,SUM(num) AS sumnum
FROM Article
GROUP BY year
,author
) AS Main
QUALIFY (
ROW_NUMBER() OVER (
PARTITION BY author
,year
ORDER BY sumnum DESC
) = 1
)
;
这会将结果集限制为最高 sumnum
,但如果您希望 year
参与进来,您可能需要更多参数来处理事情(您是 GROUP
通过它,我提出它的唯一原因)。
希望对您有所帮助!
您提到作业和有效尝试,但不正确。
这是在模型列类似于自动递增的前提下(不清楚,因为没有示例数据),并且每个作者每年只会有一个条目,并且同一作者不会有多个记录同年。例如:
model year author num
===== ==== ====== ===
1 2013 A 15
2 2013 C 18
3 2013 X 17
4 2014 A 16
5 2014 B 12
6 2014 C 16
7 2014 X 18
8 2014 Y 18
因此预期的结果是 2013 年的最高文章数 = 18,并且只有 return 作者 "C"。 2014 年,文章数量最多为 18 篇,return 作者 "X" 和 "Y"
首先,查询文章的最大写入数量是多少...
select
year,
max( num ) as ArticlesPerYear
from
Article
GROUP BY
year
这将为您提供每年一条记录,以及发表文章的最大数量...因此,如果您有 2010-2014 年的数据,您最多会有 5 条记录 returned。现在,只需将其加入具有匹配年份和文章
的原始 tableselect
A2.*
from
( select
year,
max( num ) as ArticlesPerYear
from
Article
GROUP BY
year ) PreQuery
JOIN Article A2
on PreQuery.Year = A2.Year
AND PreQuery.ArticlesPerYear = A2.num
我建议 CTE
WITH maxyear AS
(SELECT year, max(num) AS max_articles
FROM article
GROUP BY year)
SELECT DISTINCT author
FROM article a
JOIN maxyear m
ON a.year=m.year AND a.num=m.max_articles;
并将其性能与分区进行比较,这是另一种方式
SELECT DISTINCT author FROM
(SELECT author, rank() AS r
OVER (PARTITION BY year ORDER BY num DESC)
FROM article) AS subq
WHERE r = 1;
我想有些 RDBMS 会让你把 HAVING rank()=1
放在子查询上,然后你就不需要嵌套查询了。