0

1 つのクエリを実行して、age フィールドの desc で並べ替えられた結果セット A を取得し、5 に等しい色フィールドと、一致するフィールドを持つそのグループの中で、高さで並べ替えるレコードのクエリ結果 A を取得することは可能ですか? column desc すべての結果を一度に返します。

したがって、データは次のようになります。

age color height
4    5     7
3    6     1
2    9     2 
6    5     3

最初の部分の出力が得られます(年齢でソート)

age color height
6    5     1
4    5     7
3    6     2
2    9     3

クエリの最終部分の出力は次のようになります (同じ色のサブセット、高さでソート):

age color height
4    5     7
6    5     1
3    6     2
2    9     3
4

4 に答える 4

3

を使用して同じ結果を簡単に達成できるため、この例は少しわかりにくいです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

これが何をするかというと、最初に で並べ替えたときに、ウィンドウ関数が( でパーティション化された)パーティション内のすべての行にageasの最大値を割り当てます。maxagecoloragecolor

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ウィンドウ定義が気に入らないようです。)

于 2012-07-18T22:30:23.003 に答える
1

これは、順序付けに使用される基準を調整することで実行できます。

select t1.*
from t1
order by (case when color = 5 then height end) desc,
         (case when coalesce(color, 0) <> 5 then age end) desc

これは、最初に、色 = 5 のグループの中で高さの降順で並べ替えます。次に、色が 5 ではないグループの中で、年齢で並べ替えます。合体は NULL 値を処理するだけです。

以下は動作しませんので注意してください。

order by (case when color = 5 then height else age end) desc

これにより、身長と年齢が混同され、値が重複する可能性があります。

于 2012-07-18T21:29:22.510 に答える
0

サブクエリは必要ありません。2次(および3次など)の並べ替えを直接使用できます。

SELECT age, color, height
FROM table
ORDER BY color, height DESC
于 2012-07-18T21:20:40.163 に答える
0

この動作を取得するには、セカンダリ検索キーを指定するだけです。

SELECT * FROM table ORDER BY color, height DESC

生成されます:

age color height
4    5     7
6    5     1
3    6     2
2    9     3
于 2012-07-18T21:20:59.050 に答える