首页 > 解决方案 > SQL中针对特定数据列的自定义顺序

问题描述

我有一个表格,例如如下:

+-------+------+---------+---------+
| 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 |
+-------+------+---------+---------+

我想在特定条件下对上述数据进行排序,例如:按升序排列 values2 的数据where col2=A5 这意味着数据应按正常顺序排序,但 col2= 'A5' 应按 values2 的顺序排列升序或降序应该先出现 它看起来像下面这样。

+-------+------+---------+---------+
| 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 |
+-------+------+---------+---------+

col2='A5' 的数据应根据列values2的值 按升序或降序排列。这可以实现吗?

具体来说,我们只接受col2订购。如果我订购col2. 这些行将按 A1,A2,A3,A4,A5排序,而不依赖于 col values2。我在这里要问的是,当列的最大值col2 的行的特定 A5 数据的顺序应该首先出现,然后是降序中的较小值时,A5values2

在这里,我们假设当我按 col2 订购时。我们有两个 A5 数据。

| item1 | A5   |       0 |      18 | 

| item2 | A5   |       6 |      35 |

所以第二个值应该排在第一位,因为 column 的值更高values2。先来并不意味着它应该在顶部,但我的意思是它应该在 A4 之后,但基于values2col2=A5 的值,较高的应该在 A4 之后。

** 编辑了要求。

标签: postgresqlsql-order-by

解决方案


您可以尝试使用具有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'首先是所有其他记录。


推荐阅读