LoginSignup
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-09

はじめに

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

運用担当しているのがDBサイトのため、膨大なデータを扱うべくSQLを勉強し始めました。
社内にはSQLのエキスパート人材も多く在籍していたことから、教えてもらう機会には恵まれていました。
SQL初心者の私も、入社して間もなくスピード体得し、BigQueryにて数値分析できるようになりました。
今は、SQLを使える非エンジニアの社内メンバーを増やすべく、社内勉強会を実施しています。

わたしがSQLを覚えるまで

今回は、SQLエキスパートの皆さんから教わったこと・私の学習ナレッジを皆さんにお伝えさせていただきます。

1.使われているクエリを読んで真似る

はじめの頃は全然書けなかったので、
slack内でやり取りされているクエリを拾ってきて真似したり、
エンジニアさんに依頼して出してもらったデータを加工したりで覚えました。

2.書いたクエリをアウトプットしてレビューしてもらう

自分で書いたクエリをSQLエキスパートの皆さんに壁打ちさせてもらい、フィードバックを頂く…これを繰り返して覚えていきました。
image.png

非エンジニアさんにSQLを広めるために

じげんの先輩方がつくってくれていた「学ぶ人を応援するカルチャー」「学んだことを実践に生かすカルチャー」を1人でも多くのメンバーに広げることで、より生産性の高い働き方につながります。

非エンジニアの自分だからこそ伝えられることがあると思い、勉強会を実施しました。

1.覚えるメリットを知ってもらう

こちらは、先日わたしが講師を務めさせていただいたSQL勉強会の資料です。
image.png

活用シーン/メリットを具体的にイメージしてもらえるように
「こういう仕事に使える」「こんなデータを見たいときに使える」など、具体例を出しながら伝えるように心がけました。
社内では、「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共有を積極的にすることで、
チャンネル利用者を増やせるよう動いております。
image.png

まとめ

わたしがSQLを覚えられたのは、じげんのカルチャーに助けられたことが大きいですが、実際にSQLはとても汎用性の高いものだと思います。

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

参照

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
2