问题描述
╔═════╦══════════════╦══════╗
║ Name║ ValueForName ║ Num ║
╠═════╬══════════════╬══════╣
║ A ║ Jeff Atwood ║ 5636 ║
║ A ║ Geoff Dalgas ║ 120 ║
║ A ║ Jarrod Dixon ║ 340 ║
║ B ║ Joel Spolsky ║ 959 ║
║ B ║ Mark Brenna ║ 7389 ║
║ B ║ Anth Daverse ║ 148 ║
║ C ║ Ann Jefferse ║ 101 ║
║ C ║ Bonita Thorn ║ 959 ║
║ C ║ Bella Johnss ║ 959 ║
╚═════╩══════════════╩══════╝
目标是能够找到特定类别中人数最多的人。因此,我想在“ A”名称组中找到编号最高的人,在“ B”名称组中编号最多的人,以及在“ C”名称组中编号最高的人。因此,在此数据库中,A组中最高的是Jeff Atwood,B组中最高的是Mark Brenna,C组中最高的是Bonita Thorn和Bella Johnss之间的平局。如果是平局,则只会选择最近的。 现在,我正在尝试编写一些NodeJS代码,这些代码将对此数据库执行查询以产生类似于以下内容的数组的输出:
people = ("Jeff Atwood","Mark Brenna","Bonita Thorn")
您会看到人数最多的人被放入数组。 我正在考虑做类似的事情
const PLLNames = ["A","B","C"];
var sql = "SELECT ValueForName FROM database WHERE Name= " + con.escape(PLLNames[index]);
然后循环遍历,但是这段代码实际上无法找到最大的数字。
有人知道我将如何构建这样的东西吗?
解决方法
如果您想要联系,这应该可以工作:
var sql = @"
SELECT t.*
FROM databaseTable t
JOIN
(
SELECT DISTINCT
groupLetter,MAX(ValueForName) AS maxValueForName
FROM databaseTable
GROUP BY groupLetter
) a ON a.groupLetter = t.groupLetter
AND a.maxValueForName = t.ValueForName;
";
在示例数据中,C组中的两个名称之间有联系,因此它们都将被返回。
结果:
groupLetter fullName ValueForName
A Jeff Atwood 5636
B Mark Brenna 7389
C Bella Johnss 959
C Bonita Thorn 959
如果您希望根据姓名的字母顺序来决定平局,那么您可以这样做:
SELECT groupLetter,fullName,ValueForName
FROM
(
SELECT t.*,ROW_NUMBER() OVER(PARTITION BY t.groupLetter
ORDER BY t.fullName) AS rowNum
FROM databaseTable t
JOIN
(
SELECT DISTINCT
groupLetter,MAX(ValueForName) AS maxValueForName
FROM databaseTable
GROUP BY groupLetter
) a ON a.groupLetter = t.groupLetter
AND a.maxValueForName = t.ValueForName
) b
WHERE rowNum = 1;
结果:
groupLetter fullName ValueForName
A Jeff Atwood 5636
B Mark Brenna 7389
C Bella Johnss 959
否则,如果还有另一列确定谁先达到该值,则可以使用它。