获取具有特定列值但按不同列值排序的表中的所有行

时间:2015-07-01 21:48:33

标签: oracle oracle11g

我在制定这个问题时遇到了麻烦,所以我举一个例子来证明。把我的桌子视为,

CREATE TABLE ABC
(
    PID NUMBER(10,0) NOT NULL,
    DISP_COL VARCHAR2(100 BYTE),
    VAL_COL VARCHAR2(20 BYTE),
    ORD_COL1 NUMBER(5,2),
    ORD_COL2 NUMBER(5,2),
    CONSTRAINT PK_PID PRIMARY KEY
    (
        PID
    )
);

我的数据是,

PID | DISP_COL | VAL_COL | ORD_COL1 | ORD_COL2
----------------------------------------------
1   | DISP1    | VAL1    | 1        | 14
2   | DISP2    | VAL26   | 2        | 22
3   | DISP1    | VAL8    | 1        | 17
4   | DISP1    | VAL56   | 1        | 9
5   | DISP2    | VAL9    | 2        | -10
6   | DISP3    | VAL12   | 2        | 20
7   | AISP1    | VAL7    | 2        | -3

现在根据ORD_COL1,ORD_COL2的降序排列,我希望得到唯一的DISP_COL值,然后跟随该DISP_COL值的所有行。所以我的数据应该是,

PID | DISP_COL | VAL_COL | ORD_COL1 | ORD_COL2
----------------------------------------------
2   | DISP2    | VAL26   | 2        | 22
5   | DISP2    | VAL9    | 2        | -10
6   | DISP3    | VAL12   | 2        | 20
7   | AISP1    | VAL7    | 2        | -3
3   | DISP1    | VAL8    | 1        | 17
1   | DISP1    | VAL1    | 1        | 14
4   | DISP1    | VAL56   | 1        | 9

一个简单的ORDER BY ORD_COL1 DESC,ORD_COL2 DESC确实得到了我想要DISP_COL发生的顺序,但后来我想要跟随它的相同值。

我是oracle和pl / sql的新手,所以非常感谢所有帮助。提前谢谢。

2 个答案:

答案 0 :(得分:0)

SELECT * FROM ABC ORDER BY ORD_COL1 DESC, DISP_COL ASC, ORD_COL2 DESC;

http://sqlfiddle.com/#!4/40401/18

您需要通过DISP_COL中的ASC订购才能获得所需的结果。查看更新的小提琴和上面的代码。这将为您提供您想要的问题。

答案 1 :(得分:0)

以下查询有效(http://sqlfiddle.com/#!4/c340b/2/0

SELECT A1.* FROM (SELECT * FROM ABC) A1 INNER JOIN
(SELECT DISP_COL, MAX(ORD_COL1) COL1, MAX(ORD_COL2) COL2 FROM ABC
 GROUP BY DISP_COL
 ORDER BY COL1 DESC, COL2 DESC) A2 ON (A1.DISP_COL = A2.DISP_COL)
ORDER BY A2.COL1 DESC, A2.COL2 DESC, A2.DISP_COL, A1.ORD_COL1 DESC,
A1.ORD_COL2 DESC;