を使用して同じ結果を簡単に達成できるため、この例は少しわかりにくいですORDER BY color, height DESC
(行が少なすぎるようです)。
私があなたの質問を理解している限り、実際には最初に減少するようにソートすることに興味がありますが、年齢でソートしたときに連続している場合は、同じ値age
を持つ行のセットを並べ替えたいと考えています。color
ウィンドウ関数を使用することで(より具体的には結果を分割することで)、目的を達成できる場合があります。これは"標準" SQL (SQL:2003)である必要がありますが、すべての SQL RDMBS でサポートされているわけではありません (特に、私の知る限り、MySQL ではサポートされていません)。
以下はPostgreSQL (8.4 以降)を使用した実際の例です。
CREATE TABLE test_table(
age INTEGER,
color INTEGER,
height INTEGER
);
INSERT INTO test_table(age, color, height) VALUES (7, 10, 1);
INSERT INTO test_table(age, color, height) VALUES (6, 5, 1);
INSERT INTO test_table(age, color, height) VALUES (5, 5, 10);
INSERT INTO test_table(age, color, height) VALUES (4, 5, 7);
INSERT INTO test_table(age, color, height) VALUES (3, 6, 2);
INSERT INTO test_table(age, color, height) VALUES (2, 9, 3);
クエリ (ライブ デモについては SQL Fiddle を参照):
WITH cte AS (
SELECT age, color, height,
max(age) OVER (PARTITION BY color ORDER BY age DESC, color DESC)
AS maxage
FROM test_table
)
SELECT age, color, height FROM cte
ORDER BY maxage DESC, color, height;
結果:
age | color | height
-----+-------+--------
7 | 10 | 1
6 | 5 | 1
4 | 5 | 7
5 | 5 | 10
3 | 6 | 2
2 | 9 | 3
これが何をするかというと、最初に で並べ替えたときに、ウィンドウ関数が( でパーティション化された)パーティション内のすべての行にage
asの最大値を割り当てます。maxage
color
age
color
CTE の結果 (サブ選択の可能性があります) は次のとおりです (ライブ デモの SQL Fiddle を参照)。
age | color | height | maxage
-----+-------+--------+--------
7 | 10 | 1 | 7
2 | 9 | 3 | 2
3 | 6 | 2 | 3
6 | 5 | 1 | 6
5 | 5 | 10 | 6
4 | 5 | 7 | 6
ここでは、パーティション内のすべての行にcolor
同じmaxage
があり、最終結果で によって並べ替えると、 の順序も保持されますが、代わりにage
によって並べ替えることができますheight
。
MAX
(SQL Fiddle での簡単なテストでは、これが MS SQL Server 2012 および Oracle 11g R2 でも正常に動作することが示されているようです。SQL Server 2008 は、ORDER BY
ウィンドウ定義が気に入らないようです。)