您的示例有點令人困惑,因爲您可以通過使用ORDER BY color, height DESC
(似乎行數太少)輕鬆實現相同的結果。
據我理解你的問題,你在每減少age
第一反正排序真正感興趣的,但你也想重新排列的一組具有相同color
價值,如果他們是連續的,當排序行年齡。
您可以通過使用window functions(更具體地說,通過對結果進行分區)來實現所需的功能。這應該是"standard" SQL (SQL:2003),儘管它不會被所有的SQL RDMBS支持(據我所知,特別是不被MySQL支持)。
這裏是PostgreSQL (8.4 or above)一個工作示例:
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 for live demo):
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
的最大值爲maxage
分配給分區內的所有行(由color
分區),最初由age
和color
訂購。
CTE的結果(這可能是一個子選擇)是這樣(見SQL Fiddle for live demo):
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
來重新排序。
(在SQL小提琴快速測試,似乎表明這工作正常的MS SQL Server 2012和Oracle 11g R2太多; SQL Server 2008中似乎不喜歡在窗口定義MAX
和ORDER BY
。)
你的描述似乎不符合你的例子(年齡desc似乎與最終結果沒有任何關係)。爲什麼按年齡排序呢? – Bruno 2012-07-18 21:24:31
@Bruno - 顯然,只有在有不同顏色的情況下,「age」的順序纔會下降,對於相同的順序,它必須按照「height」排序。我知道,混淆 – Lamak 2012-07-18 21:25:52
@Lamak,我想我理解你的意思,但這個例子有點混亂。仍然不知道如何從第一排到第二排。 6 5 1從哪裏來? – Bruno 2012-07-18 22:35:42