メインコンテンツにスキップ
モジュール 13 · レッスン 4 / 4コース内の 52/57~12 min
モジュールのレッスン (4/4)

シフト: LAG と LEAD

シフト: LAG と LEAD

順次データと時間ベースのデータでは、多くの場合、現在の行を前日の行と比較する必要があります。 「標準」SQL では、これを行うには非常に危険な (そして非常に遅い) 自己結合が必要になります。

LAG() (前の行) 関数と LEAD() (次の行) 関数は、この問題を極めて機敏かつ優雅に解決します。

過去と未来を見つめる

SQL
SELECT
  created_at,
  total_amount,
  LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;

この例では、各行には同じテーブルによって生成された量が 1 行ずつ前方に (時間的には後方に) シフトされて保持されます。 total_amount - LAG(...) を簡単に減算して、差や前月比の変化率を計算できます。

同様に、LEAD() は、現在の行のすぐ下の行から値を取得します。

運動#sql.m13.l4.e1
試行回数: 0読み込み中…

「products」テーブルから「id」、「launched_on」、「price」を抽出し、「prev_price」、つまり論理的に「前」のものとみなされる製品の「価格」を「launched_on」の昇順で追加します。

エディターを読み込み中…
ヒントを表示

LAG(価格) OVER(ORDER BY launch_on ASC) を使用します

3 回の試行後に解決策が利用可能になります

運動#sql.m13.l4.e2
試行回数: 0読み込み中…

個々のユーザーごとの評価の上昇をどのように計算しますか?それをシミュレートします。「reviews」テーブルから「customer_id」、「created_at」、「評価」、および「next_評価」(一定期間にわたる同じ顧客の次のレビュー)を抽出します。したがって、「customer_id」で分割し、「created_at」で順序付けし、適切なウィンドウ関数を使用して先を確認します。

エディターを読み込み中…
ヒントを表示

LEAD() と PARTITION BY および ORDER BY を OVER で使用します。

3 回の試行後に解決策が利用可能になります