mysqlで連番を生成しようとすると以外と難しいです。

再起CTEなんかでやらないといけないかなと。

mariadbではsequence storage engineの機能を使うと、とてもかんたんです。

https://mariadb.com/kb/en/sequence-storage-engine

に書いてあるとおりです。

↓の感じですね。

> select * from seq_1_to_10;
+-----+
| seq |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
|   6 |
|   7 |
|   8 |
|   9 |
|  10 |
+-----+

なんで連番を生成したいかというと、歯抜けが許されない場合があるからですね。

たとえば、↓のような状況だったとします。

> CREATE TABLE `active` (
  `ymd` date NOT NULL,
  `cnt` int(11) NOT NULL,
  PRIMARY KEY (`ymd`)
);

> select * from active;
+------------+-----+
| ymd        | cnt |
+------------+-----+
| 2024-10-01 |  10 |
| 2024-10-02 |   7 |
| 2024-10-04 |  11 |
+------------+-----+

見てのとおり、「2024-10-03」のデータがありません。

ここで連番テーブルとLEFT JOINすることで、

「2024-10-03」を「0」として計上できます。

↓の感じですね。

> with
t as 
(
  select date('2024-10-01') + interval seq day as ymd from seq_0_to_3
)
select
  t.ymd as ymd,
  coalesce(active.cnt, 0) as cnt
from
  t
  left outer join
  active
  on t.ymd = active.ymd
order by
  t.ymd
;
+------------+------+
| ymd        | cnt  |
+------------+------+
| 2024-10-01 |   10 |
| 2024-10-02 |    7 |
| 2024-10-03 |    0 |
| 2024-10-04 |   11 |
+------------+------+

まあ、今更ですが、意外と連番生成は求められるので、

mariadbであるなら、sequence storage engineをつかうと楽ですよ、ってことですかね。

以上

コメントがあればどうぞ


CAPTCHA Image
Reload Image