T-SQLでサブクエリ 降順で並び替え後昇順でTOP10を抽出

 

マイクロソフトSQLServerを便利に扱うT-SQL。今回はサブクエリの事を備忘録として残しておきます。

T-SQLでサブクエリ 降順で並び替え後昇順でTOP10を抽出

SQLサーバーで最新のデータを取り出したいとき、日付降順で並び替えれば抽出できます。

 

DataTable

id mydate   value
1000 13/09/07 1000
999 13/09/04 250
998 13/09/03 3000
997 13/08/31 12
13/08/30 90
13/08/26 180
13/08/20 25
990 13/08/02 320

上のような感じですね。ですが時には、「最新のデータのうち、TOP10のみを昇順で表示したい」なんて事もありますね。ですが次のような矛盾が生じます。

「日付を降順で絞り込むと、最も新しい日付がトップに来るし日付を昇順で絞り込むと、全く古い日付データがトップに来る。」

データは新しいもの、でもトップから古い順に表示したい・・・。さて、どうしましょう。そんな時には「サブクエリ」を使います。具体的にはFrom句にサブクエリを用います。以下、T-SQLの使用を前提に説明します。

書き方は次のようになります。

SELECT 別名.列名 FROM (サブクエリ) AS 別名

見てわかるように、サブクエリの結果一つのテーブルとして扱うという方法です。

FROM句で使ったサブクエリの結果の事を「派生テーブル」とも言うようですが、注意点として、その派生テーブルには必ず名前を付ける必要があります。

上にあげた「DataTable」を例として解説しますと、次のようになります。

SELECT    SubDataTable.id, SubDataTable.mydate, SubDataTable.value
FROM      (SELECT TOP 10 * FROM DataTable order by mydate DESC) as SubDataTable
ORDER BY  mydate ASC;

ざっくりと説明すると・・・。

  • DataTableの値を日付降順で並び替え最新の物を選択できるようにしている。
  • そこから、Top値関数で上位10件のみを抽出している。(※SQLServer T-SQLを用いた場合)
  • それを「SubDataTable」という名前の「派生テーブル」として扱っている。
  • From句でその派生データが指定されている。(赤文字の部分)
  • その派生テーブルを今度は日付昇順で並び替える。

そうしますと、めでたく次のようなデータが表示されます。

id mydate value
990 13/08/02 320
13/08/20 25
13/08/26 180
13/08/30 90
997 13/08/31 12
998 13/09/03 3000
999 13/09/04 250
1000 13/09/07 1000

TOP値の扱いなど、T-SQL独特の部分もありますが、Where句で指定するなどすれば、色々と応用できるはずです。

コメント

タイトルとURLをコピーしました