Oupy (peut être ignoré)
Il y a quelques jours, lors de l'entretien, j'ai rencontré cette question lors de l'examen écrit. Après avoir lu la question plusieurs fois, j'étais encore confuse. , "Sur une période de temps. Au moins pendant N jours, la somme des scores pour chaque jour de ces N jours doit être supérieure à M." C'était tellement déroutant que je ne l'ai finalement pas écrit correctement.
J'ai pensé à cette question aujourd'hui, j'ai écrit la réponse et vérifié la déclaration SQL.
Recommandé : "tutoriel vidéo mysql", "questions d'entretien mysql2020"
questions
Un certain jeu utilise une base de données MySQL. Les scores du tableau de données enregistrent l'historique des scores de l'utilisateur, le score représente le score et la date représente la date. Chaque utilisateur générera plusieurs enregistrements chaque jour.
La structure des données et les lignes de données sont les suivantes :
Maintenant, nous avons besoin d'une liste d'utilisateurs. Ces utilisateurs doivent avoir au moins 31 utilisateurs sur les 31. jours de mars 2017. Pendant 16 jours, le score total chaque jour est supérieur à 40 points. Exprimé à l'aide d'une instruction SQL.
Les choses
Réorganiser les exigences et dessiner les points clés.
Nous avons maintenant besoin d'une liste d'utilisateurs qui ont un score quotidien supérieur à 40 points pendant au moins 16 des 31 jours de mars 2017. Exprimé à l'aide d'une instruction SQL.
Liste d'utilisateurs
représente une liste d'uid unique, qui peut être implémentée à l'aide de l'uid DISTINCT ou de l'uid GROUP BY.
Dans les 31 jours de mars 2017
Utilisez l'instruction Where pour limiter la plage horaire.
Il doit y avoir au moins 16 jours
Il faut agréger les jours et utiliser la fonction d'agrégation COUNT(*) >
La somme des scores journaliers (par personne) est supérieure à 40
Il faut agréger les scores journaliers et utiliser la fonction d'agrégation pour juger SUM(score) > 40 .
Il existe deux fonctions d'agrégation ici, mais elles concernent des dimensions différentes (jours et scores par jour), vous devez donc utiliser des sous-requêtes pour placer les deux agrégations respectivement sur les instructions SQL internes et externes.
Sur la base du principe du « de l'intérieur vers l'extérieur », nous agrégeons d'abord les scores quotidiens, c'est-à-dire agrégeons les journées.
-- 在2017年3月份的31天中 select * from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31'; -- (每人)每天得分总和大于40 -- 使用 group by uid,date 实现对分数进行聚合,使用 having sum() 过滤结果 select uid,date from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31' group by uid, `date` having sum(score) > 40; -- 至少要有16天 -- 以上条结果为基础,在对 group by uid 实现对天进行聚合,使用 having count() 过滤结果 select uid from ( select uid,date from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31' group by uid, `date` having sum(score) > 40 ) group by uid having count(*) > 15;
Réponse
SELECT uid FROM ( SELECT uid,date FROM WHERE `date` >= '2017-03-01' AND `date` <= '2017-03-31' GROUP BY uid,`date` HAVING SUM(score) > 40 ) WHERE GROUP BY uid HAVING count(*) > 15;
Vérification
-- 结构 CREATE TABLE `scores` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) DEFAULT NULL, `score` int(11) DEFAULT NULL, `date` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 数据 INSERT INTO `scores` VALUES ('1', '1', '1', '2018-04-03'); INSERT INTO `scores` VALUES ('2', '1', '2', '2018-04-03'); INSERT INTO `scores` VALUES ('3', '1', '1', '2018-04-04'); INSERT INTO `scores` VALUES ('11', '1', '4', '2018-04-04'); INSERT INTO `scores` VALUES ('12', '1', '3', '2018-04-06'); INSERT INTO `scores` VALUES ('4', '1', '3', '2018-04-07'); INSERT INTO `scores` VALUES ('5', '2', '2', '2018-04-04'); INSERT INTO `scores` VALUES ('6', '2', '4', '2018-04-04'); INSERT INTO `scores` VALUES ('7', '2', '1', '2018-04-03'); INSERT INTO `scores` VALUES ('8', '3', '3', '2018-04-06'); INSERT INTO `scores` VALUES ('9', '3', '1', '2018-04-05'); INSERT INTO `scores` VALUES ('10', '3', '2', '2018-04-04'); -- 因为数据录入量有限,我们将结果改为修改改为: -- 获取一个用户列表,时间范围是4号到6号,至少要有2天,每天分数总和大于2。 -- 查询 -- 非最精简语句,包含调试语句,可分段运行查看各个语句部分的效果。 SELECT uid FROM ( SELECT uid, `date`, sum(score) AS total_score FROM scores WHERE `date` > '2018-04-03' AND `date` < '2018-04-07' GROUP BY uid, `date` HAVING total_score > 2 ORDER BY uid, date ) AS a GROUP BY uid HAVING count(*) > 1; -- 答案是: uid : 1
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!