0

データベースの設計が不適切なため、データベース内の一連のシリアル番号を取得するのが困難です。

私は以下のようなデータを持っています:-

  1. XY100001 - XY101000 | User_A ---> 1000 データ
  2. XY101001 - XY102000 | User_B ---> 1000 データ
  3. XY102001 - XY102500 | ユーザー_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 でグループ化した後、最小シリアル番号と最大シリアル番号を選択しようとしましたが、各ユーザーには複数の範囲があるため、正しい範囲を取得できません。

以下のように最小値と最大値を使用している場合の出力例:-

| | ユーザー_A | XY100001 | XY103000 |
| | ユーザー_B | XY101001 | XY102000 |
| | ユーザー_C | XY102001 | XY102500 |

User_A の出力が間違っていることがわかります。User_A には、(XY100001-XY101000) と (XY102501-XY103000) の 2 つの範囲が必要です。

質問は、どうすればすべての範囲を取り戻すことができますか?

何か案は ?

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 に答える