プライマリ・コンテンツに移動
Oracle® Big Data Discovery Cloud Service EQLリファレンス

E65371-04
目次へ
目次
索引へ移動
索引

前
次
機械翻訳について

ORDER BY句

ORDER BY句は、結果レコードの順序を制御するために使用します。

属性名または任意の式を指定して、結果レコードをソートできます。

ORDER BY構文は、次のとおりです:
ORDER BY <Attr|Exp> [ASC|DESC] [,<Attr|Exp> [ASC|DESC]]*

ここで、Attr|Expは属性名または任意の式です。 属性は、単一割当て属性または複数割当て属性のいずれかです。

オプションで、昇順(ASC)または降順(DESC)のどちらでソートするかを指定できます。 値とソート順序を任意に組み合せて使用できます。 方向がないことは、ASCを示します。

ORDER BY句の動作は次のとおりです:
  • NULL値は、指定された属性でNULL以外の値の後に常にソートされ、NaN (not-a-number)の値は、ソートの方向にかかわらずNaNおよびNULL以外の値の後にソートされます。
  • セット(複数割当属性)を基準にソートする場合は、任意の順序が安定した順序で使用されます。
  • 結合された範囲(またはORDER BY句がないレコード)は、任意ですが安定した方法で順序付けられます: 同じバージョンのデータに対して問合せを実行しているかぎり、同じ問合せの結果が常に同じ順序で戻されます。
  • データ更新を実行すると、レコードが順序に対して追加または削除されますが、変更されていないレコードの順序は変更されません。
この例では、Price単一割当て属性は合計されてから単一割当てWineType属性でグループ化されています。 結果のレコードは、合計金額で降順にソートされます:
RETURN Results AS
SELECT SUM(Price) AS Total
FROM WineState
GROUP BY WineType
ORDER BY Total DESC
次に、この文の25レコードの小規模なセットからの結果を示します:
Total      WineType
---------------------------
| 142.34 | Red            |
| 97.97  | White          |
| 52.90  | Chardonnay     |
| 46.98  | Brut           |
| 25.99  | Merlot         |
| 21.99  | Bordeaux       |
| 16.99  | Blanc de Noirs |
| 14.99  | Pinot Noir     |
|        | Zinfandel      |
---------------------------

Zinfandelバケットは、価格にNULL値があるため、最後にソートされます。 ソート順序がASCであれば、Zinfandelはそのまま結果の最後に配置されます。

文字列のソート

文字列値は、Unicodeコード・ポイント順にソートされます。

ジオコード・ソート

geocode値でソートする場合、順序は任意ですが安定しています。それ以外の指定はありません。 geocodeデータを使用する際に、より意味のあるソート順を確立するには、ある点から距離をコンピュートし、距離でソートします。 次に例を示します。
ORDER BY LATITUDE(location), LONGITUDE(location)

式のソート

ORDER BY句を使用すると、任意の式を使用して結果のレコードをソートできます。 ORDER BY句の式では、次の簡単な文に示すように検索式を使用することを除き、ローカル文の属性のみを参照できます:
/* Invalid statement */
DEFINE T1 AS
SELECT ... AS foo
FROM SaleState;

RETURN T2 AS
SELECT ... AS bar
FROM T1
ORDER BY T1.foo  /* not allowed */

/* Valid statement */
DEFINE T1 AS
SELECT ... AS foo
FROM SaleState;

RETURN T2 AS
SELECT ... AS bar
FROM T1
ORDER BY T1[].foo  /* allowed */
また、式に集計関数を含めることはできません。 次に例を示します。
RETURN T AS
SELECT ... AS bar
FROM T1
ORDER BY SUM(bar) /* not allowed because of SUM aggregation function */

RETURN T AS
SELECT ... AS bar
FROM T1
ORDER BY ABS(bar) /* allowed */

セットでソート

前述のように、セット(複数割当属性)を基準にソートする場合、任意の安定した順序が使用されます。

この例では、Price単一割当て属性はセットに変換された後、単一割当てWineType属性でグループ化されています。 結果のレコードは、セットごとに降順でソートされます:
RETURN Results AS
SELECT SET(Price) AS PriceSet
FROM WineState
GROUP BY WineType
ORDER BY PriceSet DESC
25レコードの小さいセットからのこの文の結果は、次のようになります:
PriceSet                                              WineType
----------------------------------------------------------------------
| { 14.99 }                                         | Pinot Noir     |
| { 12.99, 13.95, 17.5, 18.99, 19.99, 21.99, 9.99 } | Red            |
| { 25.99}                                          | Merlot         |
| { 22.99, 23.99 }                                  | Brut           |
| { 21.99 }                                         | Bordeaux       |
| { 20.99, 32.99, 43.99 }                           | White          |
| { 16.99 }                                         | Blanc de Noirs |
| { 17.95, 34.95 }                                  | Chardonnay     |
|                                                   | Zinfandel      |
----------------------------------------------------------------------

この降順では、Zinfandelバケットは最後にソートされます。これは、価格割当がないためです(したがって、空のセットが返されるためです)。

ORDER BYの安定性

EQLによって、文の結果が問合せに対して安定していることが保証されます。 これは次のことを意味します:

  • 更新が実行されない場合、ORDER BY句が指定されていない場合や、ORDER BY句で指定された順序に一致する場合でも、同じ文が繰返し問合せの結果を同じ順序で返します。
  • 更新を行う場合、順序に明示的に影響する変更のみが順序に影響し、そうでない場合は影響しません。 順序は、戻されるページ上または前の結果に関与するレコードの削除や挿入、グループ化や順序付けに使用される値の変更などの変更による影響を受ける可能性があります。

たとえば、ORDER BY句がない文で、PAGE(0, 10)PAGE(10, 10)PAGE(20, 10)の順に使用する問合せの場合、更新を行わずにPAGE(20, 10)は同じ任意の安定した結果から10レコードの連続グループを返します。

更新版の文では、ORDER BY Num PAGE(3, 4)を使用する文の場合、初期問合せでレコード {5, 6, 7, 8}が返されます。 次に更新されて、4 (指定されたページの前)のレコードが挿入され、(指定されたページの) 6のレコードが削除され、9 (指定されたページの後)のレコードが挿入されます。 更新後の同じ問合せの結果は、 {4, 5, 7, 8}となります。 この理由は次のとおりです。
  • 4つの挿入では、後続のすべての結果が1つ下にシフトされます。 3つのレコードによるオフセットには、新規レコードが含まれます。
  • 6を取り外すと、以降のすべての結果が1つ上がります。
  • 9の挿入は、この結果より前またはこの結果に含まれるレコードには影響しません。

ORDER BYは、RETURN句の結果またはPAGE句の影響にのみ影響します。 PAGE句を含まないDEFINE上のORDER BYは、効果がありません。