整个块按顺序排列

时间:2014-05-21 13:27:01

标签: sql postgresql window-functions

我的查询类似于

SELECT
    a, b, c, d
FROM
    tab
ORDER BY
    a ASC, b ASC

我的结果集看起来像

+-----------------------+
|  a  |  b  |  c  |  d  |
+-----------------------+
|  A1 |  B1 |  X  | null|
|  A1 |  B2 |  X  | null|
|  A1 |  B3 |  X  | null|
|  A1 |  B4 |  X  | date|
|  A2 |  B1 |  X  | null|
|  A2 |  B2 |  X  | null|
|  A2 |  B3 |  X  | null|
|  A2 |  B4 |  X  | date|
...

其中X可以是任何东西(这里无关紧要)。我想在列A1中按日期排序A2d等块,而不更改块之间的顺序(以便B1仍然在B2之前,...)。

有什么建议吗?或者这种做法是否朝着错误的方向发展?

2 个答案:

答案 0 :(得分:1)

如果我猜你正确想要按MAX(D)为整个块(或MIN(d)?)排序块。 然后尝试此查询:

SELECT T.* 
FROM T
JOIN (SELECT a, MAX(d) as maxD 
        FROM T 
        GROUP BY a) as T1
  ON T.a=T1.a
ORDER BY T1.maxD,T.a,T.b

SQLFiddle demo

答案 1 :(得分:0)

这应该 更简单,max() ORDER BYSELECT * FROM tbl ORDER BY max(d) OVER (PARTITION BY a), a, b; window function

{{1}}