ランク付け関数と行セット関数を使用する

完了

ランク付け関数と行セット関数は、単一の値を返さないので、スカラー関数ではありません。 これらの関数は、一連の行を入力として受け入れ、一連の行を出力として返します。

ランク付け関数

ランク付け関数を使用すると、ユーザー定義の行セットに対して計算を実行できます。 これらの関数には、ランク付け、オフセット、集計、および分散関数が含まれます。

この例では、RANK 関数を使用して ListPrice に基づいてランク付けを計算し、最高価格は 1 にランク付けされています。

SELECT TOP 100 ProductID, Name, ListPrice,
RANK() OVER(ORDER BY ListPrice DESC) AS RankByPrice
FROM Production.Product AS p
ORDER BY RankByPrice;

クエリ結果は次のようになります。

ProductID

名前

ListPrice

価格でランク付け

749

Road-150 Red, 62

3578.27

1

750

Road-150 Red, 44

3578.27

1

751

Road-150 レッド, 48

3578.27

1

771

Mountain-100 Silver、38

3399.99

4

772

Mountain-100 Silver,42

3399.99

4

775

Mountain-100 Black, 38

3374.99

6

...

...

...

...

OVER

OVER 句を使用して、パーティションまたはデータ内のグループを定義できます。 たとえば、次のクエリでは、前の例を拡張して、各カテゴリ内の製品の価格ベースのランキングを計算します。

SELECT c.Name AS Category, p.Name AS Product, ListPrice,
  RANK() OVER(PARTITION BY c.Name ORDER BY ListPrice DESC) AS RankByPrice
FROM Production.Product AS p
JOIN Production.ProductCategory AS c
ON p.ProductCategoryID = c.ProductcategoryID
ORDER BY Category, RankByPrice;

このクエリの結果は次のようになります。

カテゴリ

プロダクト

ListPrice

価格でランク付け

Bib-Shorts

メンズビブショーツ S

89.99

1

Bib-Shorts

Men's Bib-Shorts, M

89.99

1

バイク ラック

Hitch Rack - 4-Bike

120

1

自転車スタンド

All-Purpose Bike Stand

159

1

ボトルとケージ

Mountain Bottle Cage

9.99

1

ボトルとケージ

ロードボトルケージ

8.99

2

ボトルとケージ

ウォーターボトル - 30オンス。

4.99

3

下角かっこ

HL Bottom Bracket

121.49

1

下角かっこ

ML Bottom Bracket

101.24

2

下角かっこ

LLボトムブラケット

53.99

3

...

...

...

...

複数の行が同じランク値を持ち、一部の値がスキップされていることに注意してください。 これは、RANK のみを使用しているためです。 要件によっては、同じランク値で同じ関係を避けたい場合があります。 必要に応じて、他の関数、DENSE_RANK、NTILE、およびROW_NUMBERを使用してランク値を制御できます。 これらの関数の詳細については、 Transact-SQL リファレンス ドキュメントを参照してください

行セット関数

行セット関数は、FROM 句でデータ ソースとして使用できる仮想テーブルを返します。 これらの関数は、行セット関数自体に固有のパラメーターを受け取ります。 これには、OPENDATASOURCE、OPENQUERY、OPENROWSET、OPENXML、OPENJSON が含まれます。

OPENDATASOURCE、OPENQUERY、OPENROWSET 関数を使用すると、リモート データベース サーバーにクエリを渡すことができます。 その後、リモート サーバーは結果行のセットを返します。 たとえば、次のクエリでは OPENROWSET を使用して 、SalesDB という名前の SQL Server インスタンスからクエリの結果を取得します。

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=SalesDB;Trusted_Connection=yes;',
    'SELECT Name, ListPrice
    FROM AdventureWorks.Production.Product') AS a;

リモート サーバーを使用するには、クエリを実行している SQL Server インスタンスでいくつかの高度なオプションを有効にする必要があります。

OPENXML 関数と OPENJSON 関数を使用すると、XML または JSON 形式の構造化データに対してクエリを実行し、表形式の行セットに値を抽出できます。

行セット関数の詳細な探索は、このモジュールの範囲外です。 詳細については、 Transact-SQL リファレンス ドキュメントを参照してください