0

是否可以运行一个查询并获得按年龄字段 desc 排序的结果集 A,然后查询结果 A 以获取任何具有的记录,比如说一个颜色字段等于 5 并且在具有匹配字段的组中,按高度对它们进行排序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

这样做是窗口函数在按和最初排序时为分区内的所有行(按 分区)age分配maxage最大值。coloragecolor

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在窗口定义中。)

于 2012-07-18T22:30:23.003 回答
1

您可以通过调整用于 order by 的标准来做到这一点。

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

不需要子查询 - 您可以直接使用二级(和三级等)排序。

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 回答