本ページでは、Realtime Compute を使用して最新のトランザクションレコードを取得する方法について説明します。

概要

E コマースの業者の注文トランザクションテーブルには、さまざまな時点の同じ注文に関する操作レコードが含まれる場合があります。 たとえば、注文トランザクションテーブルには、注文するプロダクトの数量の変更やプロダクトの返品など、ユーザーの操作が記録されます。 業者が必要とするのは、有効なトランザクションレコードの取得のみです。 次のセクションでは、Realtime Compute を使用して最新のトランザクションレコードを取得する方法について説明します。

手順

  • 構文
    SELECT col1, col2, col3
    FROM (
      SELECT col1, col2, col3
        ROW_NUMBER() OVER ([PARTITION BY col1[, col2..]]
        ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum
      FROM table_name)
    WHERE rownum <= N [AND conditions]
    パラメーター 説明 
    ROW_NUMBER() 行の数を計算するために使用される OVER ウィンドウ関数。 この値は 1 から始まります。
    PARTITION BY col1[, col2..] テーブルを分割する列。 このパラメーターは省略可能です。
    ORDER BY col1 [asc|desc][, col2 [asc|desc]...] データのソートに使用する列。 複数の列に異なる順序を指定できます。
    • テストデータ
      id (BIGINT) TIME (VARCHAR) VALUE (BIGINT)
      1 1517898096 5
      1 1517887296 44
      1 1517872896 32
      2 1517872896 10
    • テスト文
      create table source_table (
        id      BIGINT,
        `TIME`  VARCHAR,
        `VALUE` BIGINT
      )with(
        type='datahub',
        endPoint='yourEndpointURL',
        project='yourProjectName',
        topic='yourTableName',
        accessId='yourAccessId',
        accessKey='yourAccessSecret'
      );
      CREATE TABLE result_table (
           id BIGINT,
        `TIME`  VARCHAR,
        `VALUE` BIGINT
      ) WITH (
          type= 'rds',
          url = 'yourRDSDatabaseURL',
          userName = 'yourDatabaseName',
          password = 'yourDatabasePassword',
          tableName = 'yourTableName'
      );
      INSERT INTO result_table
      SELECT id,`TIME`,`VALUE`
      FROM (
          SELECT *,
             ROW_NUMBER() OVER (PARTITION BY id ORDER BY `TIME` desc) AS rownume
          FROM 
          source_table
      ) 
      WHERE rownume <= 1                
      ;
    • テスト結果
      id (BIGINT) TIME (VARCHAR) VALUE (BIGINT)
      1 1517898096 5
      2 1517872896 10
  • キー ポイント
    SELECT id,`TIME`,`VALUE`
    FROM (
        SELECT *,
           ROW_NUMBER() OVER (PARTITION BY id ORDER BY `TIME` desc) AS rownume
        FROM 
        source_table
    ) 
    WHERE rownume <= 1 

    注文テーブルの一部の注文には、異なる時間に生成されたレコードが複数あります。 各注文について最後に生成されたレコードのみを取得するには、 row_number() OVER (PARTITION BY id ORDER BY TIME DESC) を使用して、レコードを注文 ID でグループ化し、各グループのレコードを時間の降順でソートします。 計算結果には、各グループでソートされたレコードの連続番号 (グループ内で連続しており、一意です) がリストされます。 各グループの最初のレコードは、対応する注文の最後に生成されたレコードです。