非エンジニアがSQLを覚えて社内勉強会を開くまで


はじめに

株式会社じげんの田代です。
賃貸情報サービス スモッカ のマーケティングを担当させていただいております。

運用担当しているのが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はとても汎用性の高いものだと思います。

非エンジニア/エンジニアなど職種関係なく、「便利なものはみんなで生かす」ことが当たり前になると良いと思います。

参照