栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

SQL:返回每个人的最常见值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL:返回每个人的最常见值

初步评论

请学习使用显式JOIN表示法,而不是旧的(1992年前)隐式连接表示法。

老式:

SELECt transactionTable.rating as MostCommonRating FROM personTable, transactionTable WHERe personTable.transactionid = transactionTable.transactionid AND personTable.personid = 1GROUP BY transactionTable.rating ORDER BY COUNT(transactionTable.rating) desc LIMIT 1

首选样式:

SELECt transactionTable.rating AS MostCommonRating   FROM personTable  JOIN transactionTable     ON personTable.transactionid = transactionTable.transactionid  WHERe personTable.personid = 1 GROUP BY transactionTable.rating  ORDER BY COUNT(transactionTable.rating) desc  LIMIT 1

每个JOIN都需要一个ON条件。

另外,

personID
数据中的值是字符串,而不是数字,因此您需要编写

 WHERe personTable.personid = "Ben"

例如,使查询在显示的表上起作用。


主要答案

您要查找的是一个聚合的聚合:在这种情况下,是一个计数的最大值。因此,任何通用解决方案都将同时涉及MAX和COUNT。您不能将MAX直接应用到COUNT,但是可以将MAX应用于子查询中某个列恰好是COUNT的列。

使用测试驱动查询设计TDQD建立查询。

选择人员和交易等级

SELECt p.PersonID, t.Rating, t.TransactionID  FROM PersonTable AS p  JOIN TransactionTable AS t    ON p.TransactionID = t.TransactionID

选择人员,等级和等级出现次数

SELECt p.PersonID, t.Rating, COUNT(*) AS RatingCount  FROM PersonTable AS p  JOIN TransactionTable AS t    ON p.TransactionID = t.TransactionID GROUP BY p.PersonID, t.Rating

此结果将成为子查询。

查找该人获得任何评价的最大次数

SELECt s.PersonID, MAX(s.RatingCount)  FROM (SELECt p.PersonID, t.Rating, COUNT(*) AS RatingCount          FROM PersonTable AS p          JOIN TransactionTable AS t ON p.TransactionID = t.TransactionID         GROUP BY p.PersonID, t.Rating       ) AS s GROUP BY s.PersonID

现在我们知道哪个是每个人的最大数量。

所需结果

为了获得结果,我们需要从子查询中选择具有最大计数的行。请注意,如果某人具有2个好评级和2个差的评级(其中2个是该人的同一类型的最大评级数),那么将显示该人的两个记录。

SELECt s.PersonID, s.Rating  FROM (SELECt p.PersonID, t.Rating, COUNT(*) AS RatingCount          FROM PersonTable AS p          JOIN TransactionTable AS t ON p.TransactionID = t.TransactionID         GROUP BY p.PersonID, t.Rating       ) AS s  JOIN (SELECt s.PersonID, MAX(s.RatingCount) AS MaxRatingCount          FROM (SELECt p.PersonID, t.Rating, COUNT(*) AS RatingCount       FROM PersonTable AS p       JOIN TransactionTable AS t         ON p.TransactionID = t.TransactionID      GROUP BY p.PersonID, t.Rating    ) AS s         GROUP BY s.PersonID       ) AS m    ON s.PersonID = m.PersonID AND s.RatingCount = m.MaxRatingCount

如果您也想要实际的评分计数,则很容易选择。

那是相当复杂的SQL。我不想尝试从头开始编写。确实,我可能不会打扰。我将逐步开发它,如图所示。但是,因为我们已经在较大的表达式中使用子查询之前对其进行了调试,所以我们对答案很有信心。

WITH子句

请注意,标准SQL提供了一个WITH子句,该子句以SELECt语句为前缀,为子查询命名。(它也可以用于递归查询,但是我们在这里不需要。)

WITH RatingList AS     (SELECT p.PersonID, t.Rating, COUNT(*) AS RatingCount        FROM PersonTable AS p        JOIN TransactionTable AS t          ON p.TransactionID = t.TransactionID       GROUP BY p.PersonID, t.Rating     )SELECt s.PersonID, s.Rating  FROM RatingList AS s  JOIN (SELECt s.PersonID, MAX(s.RatingCount) AS MaxRatingCount          FROM RatingList AS s         GROUP BY s.PersonID       ) AS m    ON s.PersonID = m.PersonID AND s.RatingCount = m.MaxRatingCount

这更容易编写。不幸的是,MySQL还不支持WITH子句。


上面的SQL现在已经针对在Mac OS X 10.7.4上运行的IBM Informix Dynamic Server
11.70.FC2进行了测试。该测试暴露了初步评论中诊断出的问题。主要答案的SQL正常运行,无需更改。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/517338.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号