0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

普通にrow_number()つかえよ

いやいや、世の中にはrow_numberだけで解決できない情報もあるのよ。。。

例えば、以下みたいな問い合わせがあったとして。。。

問い合わせ日と区分と内容がカラムとしてある問い合わせテーブルがあったとして、
◯日~◯日までの集計結果が出したい【ただし、日付の抜けは無しで】

当然、問い合わせが毎日来てるような、ステキなシステムなら単純にSELECTしてあげればいいですが、
土日は絶対来ないとかそもそもそんな使われてないので問い合わせなんか全然来ないみたいなシステムの時に、
【対象期間の全日付を出すって何だよ??】みたいな感じになるかと。。。

そんな時に役に立つのが【コロン】ですよ

要は変数を使うということですね。
※前提条件として、レコードがある程度有るテーブルを用意する必要があります(少なくともほしい連番数分ぐらい

連番を取ってくるSQL

まずは連番(0️~)を取ってくるやつ

連番、ゲットだぜ
select
  test.num 
from
  ( 
    select
      0 as num -- 開始番号
    from
      dual 
    where
      @num := -1 -- 開始番号 -1したやつ
    union 
    select
      @num := @num + 1 as num 
    from
      `information_schema`.columns -- ここにレコードの多いテーブルを指定
    where
      @num < 20 -- ここの数字を連番の最後の番号にする(コレだと0~20まで)
  ) test

@numって変数を最初のSQLで生成して、unionしたSQLで@numをインクリしていくような感じです。
インクリするためにレコードがある程度入ってるテーブルが必要なので、
今回はスキーマ情報が入ってるシステムテーブルを使って取得しました。

派生させて〇〇日~〇〇日まで

開始日から終了日までの連番を取得して、その結果をdate_addでドンドン足していくよ

日付レコード生成だぜ
select
  date_add(str_to_date('20240101', '%Y%m%d'), interval test.num day) -- 開始日
from
  ( 
    select
      0 as num 
    from
      dual 
    where
      @num := -1 
    union 
    select
      @num := @num + 1 as num 
    from
      `information_schema`.columns 
    where
      date_add(str_to_date('20240101', '%Y%m%d'), interval @num day) < -- 開始日
      str_to_date('20240705', '%Y%m%d')                                -- 終了日
  ) test

A5M2の結果ではこんな感じに出るよ
スクリーンショット 2024-07-05 180133.png

他に何に使える?

パッと思いついたやつだと、
番号を持つテーブルのデータを物理削除していた場合に、何番のデータが存在しないの?とかの抜け番探しとかに使えるかもね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?