由于数据库设计不当,我很难在数据库中检索序列号范围。
我的数据如下: -
,数据将存储在数据库中,如下所示: -
| 1 | User_A | XY100001 | DateTime | | 2 | User_A | XY100002 | DateTime | .. | 1000 | User_A | XY101000 | DateTime | | 1001 | User_B | XY101001 | DateTime | | 1002 | User_B | XY101002 | DateTime | .. | 2000 | User_B | XY102000 | DateTime | | 2001 | User_C | XY102001 | DateTime | | 2002 | User_C | XY102002 | DateTime | .. | 2500 | User_C | XY102500 | DateTime | | 2501 | User_A | XY102501 | DateTime | | 2502 | User_A | XY102502 | DateTime | .. | 3000 | User_A | XY103000 | DateTime |
我尝试选择最小和最大序列号,在该组之后按DateTime但仍然无法获得正确的范围,因为每个用户将有多个范围。
如果我使用min和max,则输出样本如下: -
| User_A | XY100001 | XY103000 | | User_B | XY101001 | XY102000 | | User_C | XY102001 | XY102500 |
你可以看到,User_A输出错误。 User_A应具有2个范围(XY100001-XY101000)和(XY102501-XY103000)
问题是,如何找回所有范围?
有什么想法吗?
答案 0 :(得分:1)
可能的解决方案
SELECT user, MIN(sn) range_start, MAX(sn) range_end
FROM
(
SELECT user, sn, @r := IF(@g = user, @r, @r + 1) range_num, @g := user
FROM table1 CROSS JOIN (SELECT @r := 0, @g := NULL) i
ORDER BY sn
) q
GROUP BY user, range_num
示例输出:
| USER | RANGE_START | RANGE_END | |--------|-------------|-----------| | User_A | XY100001 | XY101000 | | User_A | XY102501 | XY103000 | | User_B | XY101001 | XY102000 | | User_C | XY102001 | XY102500 |
这是 SQLFiddle 演示