8

事前定義されたクエリ/ビューを除いて、Google の BigQuery ダッシュボードに似たものを作成しようとしています。私が直面している問題は、データのページネーションです。

tabledata エンドポイントは、開始インデックスを指定するか、ページ トークンを使用できるという点でページネーションをサポートしているため、次のようなことができます。

query_reply = table_data_job.list(projectId=settings.PROJECT_ID,
                                  datasetId=settings.DATASET_ID,
                                  tableId=table,
                                  startIndex=offset,
                                  maxResults=page_size).execute()

これに関する問題は、特定のクエリを実行したい (または、少なくともテーブル データの結果を並べ替えたい) ことです。

query_data = {'query': 'SELECT * FROM my_dataset.foo_table LIMIT %s' % page_size}
query_reply = job_collection.query(projectId=settings.PROJECT_ID,
                                   body=query_data).execute()

私の知る限り、上記のコードでオフセットを行う方法はありません。これは単に BigQuery が適していないことですか? 別の方法は、メモリ内でページ付けを行い、より小さな結果セットで作業することだと思いますか?

4

2 に答える 2

6

BigQuery クエリの結果はテーブルです。そのため、クエリを実行して結果から目的のテーブルを取得し、tabledata.list() API を使用して結果をページングできます。または、返信からジョブ ID を取得し、ページネーションをサポートするjobs.getQueryResults()を使用することもできます。

于 2013-06-05T20:05:24.293 に答える
1

ROW_NUMBER() を使用することによってのみ、SQL でページネーションを実現できます。

ここに一般的なテンプレートがあります

SELECT  t.*
FROM (
SELECT 
1 AS one, 
[field], 
ROW_NUMBER() OVER(PARTITION BY one) AS rownum
FROM [table] ) t WHERE rownum BETWEEN X AND Y
于 2016-07-27T16:19:11.170 に答える