はじめに
株式会社じげんの田代です。
賃貸情報サービス スモッカ のマーケティングを担当させていただいております。
運用担当しているのがDBサイトのため、膨大なデータを扱うべくSQLを勉強し始めました。
社内にはSQLのエキスパート人材も多く在籍していたことから、教えてもらう機会には恵まれていました。
SQL初心者の私も、入社して間もなくスピード体得し、BigQueryにて数値分析できるようになりました。
今は、SQLを使える非エンジニアの社内メンバーを増やすべく、社内勉強会を実施しています。
わたしがSQLを覚えるまで
今回は、SQLエキスパートの皆さんから教わったこと・私の学習ナレッジを皆さんにお伝えさせていただきます。
1.使われているクエリを読んで真似る
はじめの頃は全然書けなかったので、
slack内でやり取りされているクエリを拾ってきて真似したり、
エンジニアさんに依頼して出してもらったデータを加工したりで覚えました。
2.書いたクエリをアウトプットしてレビューしてもらう
自分で書いたクエリをSQLエキスパートの皆さんに壁打ちさせてもらい、フィードバックを頂く…これを繰り返して覚えていきました。
非エンジニアさんにSQLを広めるために
じげんの先輩方がつくってくれていた「学ぶ人を応援するカルチャー」「学んだことを実践に生かすカルチャー」を1人でも多くのメンバーに広げることで、より生産性の高い働き方につながります。
非エンジニアの自分だからこそ伝えられることがあると思い、勉強会を実施しました。
1.覚えるメリットを知ってもらう
こちらは、先日わたしが講師を務めさせていただいたSQL勉強会の資料です。
活用シーン/メリットを具体的にイメージしてもらえるように
「こういう仕事に使える」「こんなデータを見たいときに使える」など、具体例を出しながら伝えるように心がけました。
社内では、「BigQueryから自動で値をシートに落とせるGASのスクリプト」がよく活用されていたので、スクリプト共有と活用方法をレクチャーしました。
BigQueryから自動で値をシートに落とせるGASのスクリプト
/* 実行するProject ID */
var projectId = 'hogehoge';
function runAllQueries() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var queries_sheet = spreadsheet.getSheetByName("Queries");
for (var i = 2; i <= queries_sheet.getLastRow(); i++) {
var sheet_name = queries_sheet.getRange(i, 1).getValue();
var sheet = spreadsheet.getSheetByName(sheet_name);
if(sheet == null) {
sheet = spreadsheet.insertSheet();
sheet.setName(sheet_name);
}
runQuery(
queries_sheet.getRange(i, 2).getValue(),
sheet,
queries_sheet.getRange(i, 3).getValue()
);
}
}
function runQuery(query, sheet, query_exec_bool) {
if (!query_exec_bool) {
return;
}
var request = {
query: query,
useLegacySql: false
};
var queryResults = BigQuery.Jobs.query(request, projectId);
var jobId = queryResults.jobReference.jobId;
// Check on status of the Query Job.
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {location: 'asia-northeast1'});
}
// Get all the rows of results.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
pageToken: queryResults.pageToken,
location: 'asia-northeast1'
});
rows = rows.concat(queryResults.rows);
}
if (rows) {
// clear exists data
sheet.clear();
// Append the headers.
var headers = queryResults.schema.fields.map(function(field) {
return field.name;
});
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].f;
data[i] = new Array(cols.length);
for (var j = 0; j < cols.length; j++) {
data[i][j] = cols[j].v;
if(headers[j].substr(-3)=="_at") {
data[i][j] = cols[j].v
if(data[i][j] < 10000000000000) {
data[i][j] = new Date(data[i][j]);
}
else if(data[i][j] < 10000000000000*1000) {
data[i][j] = new Date(data[i][j] / 1000);
}
}
}
}
sheet.getRange(2, 1, rows.length, headers.length).setValues(data);
} else {
Logger.log('No rows returned.');
}
};
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "クエリを実行",
functionName : "runAllQueries"
}];
spreadsheet.addMenu("BigQuery", entries);
};
2.気軽に質問できる場所をつくる
社内には、気軽に分析に関する質問を投げられるslackチャンネルがあります。
チャンネル周知と、データ基盤チームと連携してTips共有を積極的にすることで、
チャンネル利用者を増やせるよう動いております。
まとめ
わたしがSQLを覚えられたのは、じげんのカルチャーに助けられたことが大きいですが、実際にSQLはとても汎用性の高いものだと思います。
非エンジニア/エンジニアなど職種関係なく、「便利なものはみんなで生かす」ことが当たり前になると良いと思います。
参照