力扣sql

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排序
3.换座位

示例:

+———+———+
| id | student |
+———+———+
| 1 | Abbot |
| 2 | Doris |
| 3 | Emerson |
| 4 | Green |
| 5 | Jeames |
+———+———+
假如数据输入的是上表,则输出结果如下:

+———+———+
| id | student |
+———+———+
| 1 | Doris |
| 2 | Abbot |
| 3 | Green |
| 4 | Emerson |
| 5 | Jeames |
+———+———+

select
case
when id!=counts and mod(id,2)!=0 then id+1
when id=counts and mod(id,2)!=0 then id
else id-1 end
as id,student
from seat,(select count(*) as counts from seat) as b order by id