您的示例有点令人困惑,因为您可以通过使用轻松获得相同的结果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
分配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 Fiddle 中的快速测试似乎表明这也适用于 MS SQL Server 2012 和 Oracle 11g R2;SQL Server 2008 似乎不喜欢MAX
并且ORDER BY
在窗口定义中。)