マイクロソフト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句で指定するなどすれば、色々と応用できるはずです。
コメント