SQL中针对列特定数据的自定义顺序

时间:2019-03-11 10:56:04

标签: postgresql sql-order-by

我有一个表格,如下所示:

+-------+------+---------+---------+
| Col1  | col2 | values1 | values2 |
+-------+------+---------+---------+
| item1 | A4   |       5 |      87 |
| item1 | A1   |       5 |      11 |
| item1 | A2   |       5 |      25 |
| item1 | A3   |       5 |      33 |
| item1 | A5   |       0 |      18 |
| item2 | A4   |      12 |      72 |
| item2 | A1   |       6 |      12 |
| item2 | A2   |       6 |      26 |
| item2 | A3   |       6 |      34 |
| item2 | A5   |       6 |      35 |
+-------+------+---------+---------+

我想在特定条件下对上述数据进行排序,例如:以升序对value2的数据进行排序,其中 col2 = A5 表示数据应该按正常顺序排列,但如果col2 ='A5',则按值2顺序排列的行应递增或递减 如下图所示。

+-------+------+---------+---------+
| Col1  | col2 | values1 | values2 |
+-------+------+---------+---------+
| item1 | A1   |       5 |      11 |
| item1 | A2   |       5 |      25 |
| item1 | A3   |       5 |      33 |
| item1 | A4   |       5 |      87 |
| item2 | A5   |       6 |      35 |
| item2 | A1   |       6 |      12 |
| item2 | A2   |       6 |      26 |
| item2 | A3   |       6 |      34 |
| item2 | A4   |      12 |      72 |
| item1 | A5   |       0 |      18 |
+-------+------+---------+---------+

应根据列 values2 的值以升序或降序对col2 ='A5'的数据进行排序。能做到吗?

具体地说,让我们仅进行col2排序。如果我订购col2。这些行将按 A1,A2,A3,A4,A5 排序,而不依赖于col values2。我要问的是,col2 A5行中具有列values2最大值的| item1 | A5 | 0 | 18 | 的A5数据的顺序应该排在最前面,然后降序较小,

这里假设我按col2订购。我们有两个关于A5的数据。

| item2 | A5   |       6 |      35 |

values2

因此,由于列values2的值较高,因此第二个值应该优先。 首先出现并不意味着它应该在顶部,但是我的意思是它应该在A4之后,但基于col2 = A5的case class CustomID(value: Int) extends MappedTo[Int] 值,更高的应该在A4之后。

**编辑了要求。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用具有两级排序的ORDER BY子句:

SELECT Col1, col2, values1, values2
FROM yourTable
ORDER BY
    CASE WHEN col2 = 'A5' THEN 0 ELSE 1 END,
    values2 DESC;

这将放置所有col2 = 'A5'首先的记录,然后是所有其他记录。在这两个组的每个组中,第二个条件按values2降序排列。

注意:自从我最初回答以来,OP多次更改了他的问题。最初的问题是询问如何首先使用col2 = 'A5'来排序记录,然后是所有其他记录。