我的表中的数据如下所示:
+---+----+
| a | b |
+---+----+
| a | 1 |
| a | 2 |
| a | 4 |
| a | 5 |
| b | 1 |
| b | 3 |
| b | 5 |
| c | 5 |
| c | 4 |
| c | 3 |
| c | 2 |
| c | 1 |
+---+----+
我想生成一个 SQL 查询来输出如下数据:
+---+-----------+
| a | 1-2, 4-5 |
| b | 1,3,5 |
| c | 1-5 |
+---+-----------+
有没有办法纯粹用 SQL(特别是 MySQL 5.1?)来做到这一点
我得到的最接近的是select a, concat(min(b), "-", max(b)) from test group by a;
,但这没有考虑范围内的差距。
最佳答案
用途:
SELECT a, GROUP_CONCAT(x.island)
FROM (SELECT y.a,
CASE
WHEN MIN(y.b) = MAX(y.b) THEN
CAST(MIN(y.b) AS VARCHAR(10))
ELSE
CONCAT(MIN(y.b), '-', MAX(y.b))
END AS island
FROM (SELECT t.a, t.b,
CASE
WHEN @prev_b = t.b -1 THEN
@group_rank
ELSE
@group_rank := @group_rank + 1
END AS blah,
@prev_b := t.b
FROM TABLE t
JOIN (SELECT @group_rank := 1, @prev_b := 0) r
ORDER BY t.a, t.b) y
GROUP BY y.a, y.blah) x
GROUP BY a
这个想法是,如果您为组序列值分配一个值,那么您可以使用 MIN/MAX 来获取适当的值。 IE:
a | b | blah
---------------
a | 1 | 1
a | 2 | 1
a | 4 | 2
a | 5 | 2
关于sql - MySQL 中的串联范围描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3269939/