0

由于数据库设计不当,我很难检索数据库中的序列号范围。

我的数据如下:-

  1. XY100001 - XY101000 | User_A ---> 1000 个数据
  2. XY101001 - XY102000 | User_B ---> 1000 个数据
  3. XY102001 - XY102500 | User_C ---> 500 个数据
  4. XY102501 - XY103000 | User_A ---> 1000 个数据

并且数据将存储在数据库中,如下所示:-

| 1 | 用户A | XY100001 | 日期时间 |
| 2 | 用户A | XY100002 | 日期时间 |
..
| 1000 | 用户A | XY101000 | 日期时间 |
| 1001 | 用户_B | XY101001 | 日期时间 |
| 1002 | 用户_B | XY101002 | 日期时间 |
..
| 2000 | 用户_B | XY102000 | 日期时间 |
| 2001 | 用户_C | XY102001 | 日期时间 |
| 2002 | 用户_C | XY102002 | 日期时间 |
..
| 2500 | 用户_C | XY102500 | 日期时间 |
| 2501 | 用户A | XY102501 | 日期时间 |
| 2502 | 用户A | XY102502 | 日期时间 |
..
| 3000 | 用户A | XY103000 | 日期时间 |

我尝试选择最小和最大序列号,在该组之后按 DateTime 但仍然无法获得正确的范围,因为每个用户将有多个范围。

如果我使用 min 和 max 的示例输出如下:-

| 用户A | XY100001 | XY103000 |
| 用户_B | XY101001 | XY102000 |
| 用户_C | XY102001 | XY102500 |

您可以看到,User_A 的输出错误。User_A 应该有 2 个范围 (XY100001-XY101000) 和 (XY102501-XY103000)

问题是,我怎样才能找回所有的范围?

有任何想法吗 ?

4

1 回答 1

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

样本输出:

| 用户 | RANGE_START | RANGE_END |
|--------|-------------|------------|
| 用户A | XY100001 | XY101000 |
| 用户A | XY102501 | XY103000 |
| 用户_B | XY101001 | XY102000 |
| 用户_C | XY102001 | XY102500 |

这是SQLFiddle演示

于 2013-11-04T07:35:36.003 回答