結果のソートと制限
単純なクエリーの場合のSELECTコマンドの使用。
CQLは、SQLと同様に、単純または複雑な修飾子を使用してデータを選択(SELECT)できます。最も単純な場合、クエリーは、テーブルにあるデータをすべて選択します。最も複雑な場合では、クエリーは、どのデータを取得して表示するかを記述し、ユーザー定義関数に基づいて新しい値の計算も行います。このセクションでは、cyclingキースペースのいくつかのサンプル・テーブルを使用します。
SASIのインデックス作成については、「SASIの使用」のクエリーの説明を参照してください。
PER PARTITION LIMITを使用した、返される行数の制御
PER PARTITION LIMIT
オプションを使用して、クエリーで各パーティションから返される行数の最大数を設定します。データを複数のパーティションにソートするテーブルを作成します。
CREATE TABLE cycling.rank_by_year_and_name (
race_year int,
race_name text,
cyclist_name text,
rank int,
PRIMARY KEY ((race_year, race_name), rank)
);
データを挿入した後、テーブルには以下の値が格納されます。
race_year | race_name | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT
2014 | 4th Tour of Beijing | 2 | Daniel MARTIN
2014 | 4th Tour of Beijing | 3 | Johan Esteban CHAVES
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Benjamin PRADES
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 2 | Carlos BETANCUR
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Thomas LEBAS
次に、レース年とレース名ごとに上位2名のサイクリストを取得するには、次のコマンドとPER PARTITION LIMIT 2
を使用します。
SELECT *
FROM cycling.rank_by_year_and_name
PER PARTITION LIMIT 2;
出力:
race_year | race_name | rank | cyclist_name
-----------+--------------------------------------------+------+----------------------
2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT
2014 | 4th Tour of Beijing | 2 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN
2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN
2015 | Giro d'Italia - Stage 11 - Forli > Imola | 2 | Carlos BETANCUR
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES
2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN
手順
-
サイクリスト・カテゴリー・テーブルのデータをすべて表示するには、単純な
SELECT
クエリーを使用します。CREATE TABLE cycling.cyclist_category ( category text, points int, id UUID, lastname text, PRIMARY KEY (category, points)) WITH CLUSTERING ORDER BY (points DESC); SELECT * FROM cycling.cyclist_category;
category | points | id | lastname ---------------+--------+--------------------------------------+------------ One-day-races | 367 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | TIRALONGO One-day-races | 198 | 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | KRUIJSWIJK Time-trial | 182 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | TIRALONGO Time-trial | 3 | 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | KRUIJSWIJK Sprint | 39 | 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | KRUIJSWIJK Sprint | 0 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | TIRALONGO GC | 1324 | 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | KRUIJSWIJK GC | 1269 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | TIRALONGO
-
以下の例は、categoryをフィルターとして使用するクエリーを作成する方法を示しています。
SELECT * FROM cycling.cyclist_category WHERE category = 'Sprint';
category | points | id | lastname ----------+--------+--------------------------------------+------------ Sprint | 39 | 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | KRUIJSWIJK Sprint | 0 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | TIRALONGO
categoryがパーティション・キーまたはクラスター化カラムではない場合、このクエリーではディスク上のデータを検索できないため、クエリーは拒否されます。クエリーは、cyclist_categoryテーブル全体で連続取得を必要とします。DataStax Enterpriseではこれは重要な概念として理解しておく必要があり、すべてのノードのデータをすべてスキャンするのは非常に時間がかかるため、その実行はブロックされます。パーティション・キーとクラスター化カラムを
WHERE
条件句で使用すると、連続した行のセットを選択することになります。セカンダリ・インデックスを使用するとクエリーをフィルター処理できます。「インデックスの作成と維持」を参照してください。lastnameに基づいたクエリーは、lastnameカラムのインデックスが作成されている場合には満足のいく結果が得られます。
-
セカンダリ・インデックスが作成されていない場合でも、
ALLOW FILTERING
も使用すればクラスター化カラムをWHERE
句内で定義できます。テーブル定義、SELECT
コマンドの順に指定します。race_start_date
はセカンダリ・インデックスのないクラスター化カラムであることに注意してください。CREATE TABLE cycling.calendar ( race_id int, race_name text, race_start_date timestamp, race_end_date timestamp, PRIMARY KEY (race_id, race_start_date, race_end_date) );
SELECT * FROM cycling.calendar WHERE race_start_date = '2015-06-13' ALLOW FILTERING;
race_id | race_start_date | race_end_date | race_name ---------+---------------------------------+---------------------------------+---------------- 102 | 2015-06-13 00:00:00.000000+0000 | 2015-06-21 00:00:00.000000+0000 | Tour de Suisse
-
すべてのデータを選択する代わりに、カラムを選択して表示することもできます。
SELECT category, points, lastname FROM cycling.cyclist_category;
category | points | lastname ---------------+--------+------------ One-day-races | 367 | TIRALONGO One-day-races | 198 | KRUIJSWIJK Time-trial | 182 | TIRALONGO Time-trial | 3 | KRUIJSWIJK Sprint | 39 | KRUIJSWIJK Sprint | 0 | TIRALONGO GC | 1324 | KRUIJSWIJK GC | 1269 | TIRALONGO
-
大きなテーブルについては、
LIMIT
を使用して、取得する行の数を制限します。デフォルトの制限は10,000行です。データをサンプリングするには、小さい数を選択します。10,000行を超えるデータを取得するには、LIMIT
を大きな値に設定します。CREATE TABLE cycling.cyclist_name ( id UUID PRIMARY KEY, lastname text, firstname text ); SELECT id, lastname, firstname FROM cycling.cyclist_name LIMIT 3;
id | lastname | firstname --------------------------------------+----------+----------- e7ae5cf3-d358-4d99-b900-85902fda9bb0 | FRAME | Alex fb372533-eb95-4bb4-8685-6ef61e994caa | MATTHEWS | null 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | VOS | null
-
ORDER BY
句を使用すると、表示順を微調整できます。パーティション・キーは、WHERE
条件句で定義する必要があります。また、ORDER BY
条件句は、順序指定に使用するクラスター化カラムを定義します。CREATE TABLE cycling.cyclist_cat_pts ( category text, points int, id UUID,lastname text, PRIMARY KEY (category, points) ); SELECT * FROM cycling.cyclist_cat_pts WHERE category = 'GC' ORDER BY points ASC;
category | points | id | lastname ----------+--------+--------------------------------------+------------ GC | 780 | 829aa84a-4bba-411f-a4fb-38167a987cda | SUTHERLAND GC | 1269 | 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | TIRALONGO
-
タプルは、全体で取得されます。この例では、
AS
を使用してタプル名のヘッダーを変更します。SELECT race_name, point_id, lat_long AS CITY_LATITUDE_LONGITUDE FROM cycling.route;
-
PER PARTITION LIMIT
オプションを使用して、クエリーで各パーティションから返される行数の最大数を設定します。これは、パーティションが正しく分割されていればクエリーで「上位3位」を選択できるので、興味深い手法です。データを複数のパーティションにソートし、データを挿入するテーブルを作成します。CREATE TABLE cycling.rank_by_year_and_name ( race_year int, race_name text, cyclist_name text, rank int, PRIMARY KEY ((race_year, race_name), rank) );
race_year | race_name | rank | cyclist_name -----------+--------------------------------------------+------+---------------------- 2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT 2014 | 4th Tour of Beijing | 2 | Daniel MARTIN 2014 | 4th Tour of Beijing | 3 | Johan Esteban CHAVES 2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN 2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES 2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Benjamin PRADES 2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN 2015 | Giro d'Italia - Stage 11 - Forli > Imola | 2 | Carlos BETANCUR 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Thomas LEBAS
-
次に、
PER PARTITION LIMIT
を使用して、レース年とレース名のペアごとに上位2つのレースを取得します。SELECT * FROM cycling.rank_by_year_and_name PER PARTITION LIMIT 2;
race_year | race_name | rank | cyclist_name -----------+--------------------------------------------+------+---------------------- 2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT 2014 | 4th Tour of Beijing | 2 | Daniel MARTIN 2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Daniel MARTIN 2014 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Johan Esteban CHAVES 2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN 2015 | Giro d'Italia - Stage 11 - Forli > Imola | 2 | Carlos BETANCUR 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN