MySQL SQL: 查找列值与前一行不同的行
在MySQL中,如果我们想要查找一个表中某列的值与前一行不同时,该怎么做呢?这就需要使用到MySQL SQL中的一些语句和函数。
首先,我们可以使用窗口函数LAG()来获取前一行的值,然后将其与当前行的值进行比较,如果不同,则选择该行。
例如,如果我们有以下的数据表:
| id | name | score |
|---|---|---|
| 1 | Tom | 85 |
| 2 | Jack | 78 |
| 3 | Lily | 90 |
| 4 | Mary | 90 |
| 5 | Simon | 64 |
| 6 | Tony | 88 |
我们想要选择score列与前一行不同的行,我们可以这样查询:
SELECT
id, name, score
FROM
(
SELECT
id, name, score,
LAG(score) OVER (ORDER BY id) AS pre_score
FROM
test
) AS t
WHERE
score != pre_score OR pre_score IS NULL;
结果如下:
| id | name | score |
|---|---|---|
| 1 | Tom | 85 |
| 2 | Jack | 78 |
| 3 | Lily | 90 |
| 5 | Simon | 64 |
| 6 | Tony | 88 |
我们可以看到,行4没有被选择,因为它与前一行的score值相同。
另外,如果我们想要查找字符串列中与前一行不同的行时,可以使用MySQL内置函数ASCII()和SUBSTRING()。
例如,如果我们有以下的数据表:
| id | name | age |
|---|---|---|
| 1 | Tom | 24 |
| 2 | Jack | 28 |
| 3 | Lily | 22 |
| 4 | Mary | 25 |
| 5 | Simon | 29 |
| 6 | Tony | 27 |
我们想要选择name列与前一行不同的行,我们可以这样查询:
SELECT
id, name, age
FROM
(
SELECT
id, name, age,
LAG(SUBSTRING(name, ASCII('a'), 1)) OVER (ORDER BY id) AS pre_name
FROM
test
) AS t
WHERE
SUBSTRING(name, ASCII('a'), 1) != pre_name OR pre_name IS NULL;
结果如下:
| id | name | age |
|---|---|---|
| 1 | Tom | 24 |
| 2 | Jack | 28 |
| 3 | Lily | 22 |
| 5 | Simon | 29 |
| 6 | Tony | 27 |
我们可以看到,行4没有被选择,因为它与前一行的name值相同。
阅读更多:MySQL 教程
总结
在MySQL中,我们可以使用窗口函数LAG()和一些内置函数来查找某列的值与前一行不同时的行,从而满足我们的查询需求。
极客教程