按多列

时间:2016-04-27 13:16:01

标签: postgresql sorting

假设我有一个名为extable

的表
|--A--|--B--|--C--|
|-----|-----|-----|
|01:21| 4-1 | no  |
|01:28| 4-2 | yes |
|05:53| 3-5 | yes |
|03:34| 9-1 | yes |
|18:48| 9-1 | yes |
|13:01| 9-1 | yes |
|00:17| 7-4 | yes |
|14:24| 4-1 | no  |
|18:19| 4-1 | yes |
|08:02| 7-4 | yes |
|15:21| 7-4 | no  |
|21:23| 3-5 | no  |
|02:57| 4-2 | no  |
|21:03| 4-2 | yes |
|11:31| 4-1 | no  |

我如何按时间排序,列A,然后是列B,然后是列C,如下所示:

|--A--|--B--|--C--|
|-----|-----|-----|
|05:53| 3-5 | yes |
|21:23| 3-5 | no  |
|18:19| 4-1 | yes |
|14:24| 4-1 | no  |
|21:03| 4-2 | yes |
|02:57| 4-2 | no  |
|08:02| 7-4 | yes |
|15:21| 7-4 | no  |
|18:48| 9-1 | yes |
|21:56| 9-1 | no  |

我希望能够按B列中从最低到最高的顺序对其进行排序。然后,我希望{B}中的每个条目的yes选项前面都有no。列中的时间戳A将是最新的yesno条目。我觉得我解释它比上面的例子效果要差很多。

我知道我可以这样做:ORDER BY column B, column C, column A;,但这会将每个条目从原始表中拉出来。如果有意义的话,我只希望在A列的时间戳中找到最新的那些。请注意9-1在原始表格中有四个条目,但只提取了最新的yesno选项。

谢谢

1 个答案:

答案 0 :(得分:1)

您有两个要求:1)按照列出的顺序订购结果2)仅为每列保留最新的是/否值" B"

ORDER BY子句非常简单。唯一的变化是坚持" DESC"在子句中的C字段之后,yes首先出现。

第二个要求可以使用窗口函数来解决,以便按BC对结果集中的行进行分组,然后按A对每个组中的结果进行排序。然后我们保留任何排名为1

的内容

以下内容应该有效:

SELECT A,B,C
FROM
    (
        SELECT 
            A,
            B,
            C,
            ROW_NUMBER() OVER (PARTITION BY B, C ORDER BY A DESC) as keeprank
        FROM <table>
    ) t1
WHERE keeprank = 1
ORDER BY A, B, C DESC