データの分析や処理に便利なBigQuery(BQ)。
前回ロット単位生産商品の必要ロット数を計算する方法を紹介した。
ではロット数量のレコードからロット単位のレコードを展開することはできるのだろうか。
そこで今回はBigQueryでロット数量からロット単位のレコードを作成する方法について紹介する。
この記事を書いている人
記事を読むメリット
BigQueryでロット数量からロット単位のレコードを作成する方法がわかる
データ準備
ではまずデータを準備する。
以下のCSVを lot_problem_sample2
というテーブルとして取り込む。
product,lot_pcs,time,demand,demand_lot a,10,1,21,3 a,10,2,22,2 a,10,3,5,0 a,10,4,0,0 a,10,5,36,4 a,10,6,40,4
すると以下のようなテーブルとなる。
Row | product | lot_pcs | time | demand | demand_lot |
1 | a | 10 | 1 | 21 | 3 |
2 | a | 10 | 2 | 22 | 2 |
3 | a | 10 | 3 | 5 | 0 |
4 | a | 10 | 4 | 0 | 0 |
5 | a | 10 | 5 | 36 | 4 |
6 | a | 10 | 6 | 40 | 4 |
BigQueryでロット数量からロット単位のレコードを作成する方法
ではロット数量からロット単位のレコードを作成する。
方法としては連続した整数のテーブルデータを作り、その連番テーブルと結合する。
まずは連番テーブルのデータを作る。
連番は GENERATE_ARRAY()
で配列データを作り、それを UNNEST
するとテーブルデータになる。
SELECT seq FROM UNNEST(GENERATE_ARRAY(1, 10)) AS seq
Row | seq |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
10 | 10 |
この連番データをロット数量のデータと結合し、連番がロット数量以下の部分だけ残す。
SELECT r.*, n.seq as lot_seq FROM project.detaset.lot_problem_sample2 AS r, (SELECT seq FROM UNNEST(GENERATE_ARRAY(1, 10)) AS seq) AS n WHERE r.demand_lot >= n.seq order by r.product,r.time, n.seq
するとロット数量のデータから、ロット単位にレコードを持つデータが作成できる。
Row | product | lot_pcs | time | demand | demand_lot | lot_seq |
1 | a | 10 | 1 | 21 | 3 | 1 |
2 | a | 10 | 1 | 21 | 3 | 2 |
3 | a | 10 | 1 | 21 | 3 | 3 |
4 | a | 10 | 2 | 22 | 2 | 1 |
5 | a | 10 | 2 | 22 | 2 | 2 |
6 | a | 10 | 5 | 36 | 4 | 1 |
7 | a | 10 | 5 | 36 | 4 | 2 |
8 | a | 10 | 5 | 36 | 4 | 3 |
9 | a | 10 | 5 | 36 | 4 | 4 |
10 | a | 10 | 6 | 40 | 4 | 1 |
11 | a | 10 | 6 | 40 | 4 | 2 |
12 | a | 10 | 6 | 40 | 4 | 3 |
13 | a | 10 | 6 | 40 | 4 | 4 |
レコードできてる
まとめ
今回はBigQueryでロット数量からロット単位のレコードを作成する方法について解説した。
やり方としては以下の通り。
ロット単位レコードの作り方
GENERATE_ARRAY()
で連番データを作る他にもSQLのちょっとしたテクニックについてまとめているので、もし気になったら見てみて欲しい。
あわせて読みたい