1.sql查找所有至少连续出现三次的数字
建表
create table `logs` (
`id` int (10),
`num` int (11)
);
insert into `logs` (`id`, `num`) values(‘1′,’1’);
insert into `logs` (`id`, `num`) values(‘2′,’2’);
insert into `logs` (`id`, `num`) values(‘3′,’3’);
insert into `logs` (`id`, `num`) values(‘4′,’1’);
insert into `logs` (`id`, `num`) values(‘5′,’1’);
insert into `logs` (`id`, `num`) values(‘6′,’1’);
insert into `logs` (`id`, `num`) values(‘7′,’3’);
insert into `logs` (`id`, `num`) values(‘8′,’3’);
insert into `logs` (`id`, `num`) values(‘9′,’4′);
insert into `logs` (`id`, `num`) values(’10’,’4′);
insert into `logs` (`id`, `num`) values(’11’,’4′);
查询
SELECT DISTINCT Num AS ConsecutiveNums
FROM (
SELECT Num,
CASE
WHEN @currnet = Num THEN @count := @count + 1
WHEN (@currnet := Num) IS NOT NULL THEN @count := 1
END AS CNT
FROM LOGS, (SELECT @currnet := NULL,@count := 0) AS t
) AS temp
WHERE temp.CNT >= 3
结果是数字:1 和 4
2.编写一个 SQL 查询来实现分数排名。
如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。
+—-+——-+
| Id | Score |
+—-+——-+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+—-+——-+
例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):
+——-+——+
| Score | Rank |
+——-+——+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+——-+——+
实现:
SELECT s1.Score,COUNT(DISTINCT(s2.score)) Rank FROM Scores s1,Scores s2 WHERE s1.score<=s2.score GROUP BY s1.Id ORDER BY Rank; 分析:s1.score<=s2.score筛选出包含自己和比自己大的s2.score COUNT(DISTINCT(s2.score)) Rank 按 s1.Id分组,去重统计有几个包含自己和比自己大的s2.score,也就得到了s2.score的排序,最后按照Rank排序