如何对两列(整数和字符串)进行排序?
How to sort two columns (integer and string)?
我有一个 table,其中第一列是整数,第二列是字符串。我想要的是第一列首先按顺序排序,然后当值相同时第二列应该一个接一个地分组。为了模拟我的想法,请参见下文。不确定这是否可能?
对 2 列进行排序
你看到正确的顺序应该如下所示,其中 Seq 是 运行 升序排列,但是当有相同的阶段时,它会在移动到下一个之前选择它下面的列表。所以顺序排列正确,相位分组也正确
[
在两列之后使用关键字 ASC
或 DESC
SELECT *
FROM table
INNER JOIN (
SELECT phase,max(seq) as k
FROM table
GROUP BY phase) keytable
using (phase)
ORDER BY k asc, seq asc
修改查询以满足您的需要
你的需求只能这样解决
SELECT * FROM table ORDER BY column1, column2
你不明白的是,如果 column1
先排序,那么 column2
只会以不违反 column1
排序的方式排序
考虑这个 table :
----------------------------------
empid | empname | salary |
----------------------------------
200 | Johnson | 10000 |
----------------------------------
400 | Adam | 12000 |
----------------------------------
300 | Mike | 11000 |
----------------------------------
100 | Johnson | 17000 |
----------------------------------
500 | Tomyknoker | 10000 |
----------------------------------
如果您按 empid
和 empname
排序,则输出将如下所示
empid | empname | salary |
----------------------------------
100 | Johnson | 17000 |
----------------------------------
200 | Johnson | 10000 |
----------------------------------
300 | Mike | 11000 |
----------------------------------
400 | Adam | 12000 |
----------------------------------
500 | Tomyknoker | 10000 |
----------------------------------
所以在这里,首先,empid
被排序为 100, 200, 300, 400, 500
。
现在 empid
100
对应 Johnson -> 17000
而 200
对应 Johnson -> 10000
,所以一旦 empid 被排序,它将尝试排序 empname
明白了吗?
帮助您实现排序目标的 hack,也许您可以向 table 添加一个组字段,这样您就可以以更简洁的方式实现您想要的结果。
SELECT * FROM [PlanActual]
ORDER BY Phase, LEFT(Seq,1)
这可能接近您想要的:
SELECT t1.*
FROM PlanActual AS t1
INNER JOIN (
SELECT MIN(Seq) AS minSeq, Phase
FROM PlanActual
GROUP BY Phase
) AS t2 ON t1.Phase = t2.Phase
ORDER BY t2.minSeq
我有一个 table,其中第一列是整数,第二列是字符串。我想要的是第一列首先按顺序排序,然后当值相同时第二列应该一个接一个地分组。为了模拟我的想法,请参见下文。不确定这是否可能?
对 2 列进行排序
你看到正确的顺序应该如下所示,其中 Seq 是 运行 升序排列,但是当有相同的阶段时,它会在移动到下一个之前选择它下面的列表。所以顺序排列正确,相位分组也正确
[
在两列之后使用关键字 ASC
或 DESC
SELECT *
FROM table
INNER JOIN (
SELECT phase,max(seq) as k
FROM table
GROUP BY phase) keytable
using (phase)
ORDER BY k asc, seq asc
修改查询以满足您的需要
你的需求只能这样解决
SELECT * FROM table ORDER BY column1, column2
你不明白的是,如果 column1
先排序,那么 column2
只会以不违反 column1
排序的方式排序
考虑这个 table :
----------------------------------
empid | empname | salary |
----------------------------------
200 | Johnson | 10000 |
----------------------------------
400 | Adam | 12000 |
----------------------------------
300 | Mike | 11000 |
----------------------------------
100 | Johnson | 17000 |
----------------------------------
500 | Tomyknoker | 10000 |
----------------------------------
如果您按 empid
和 empname
排序,则输出将如下所示
empid | empname | salary |
----------------------------------
100 | Johnson | 17000 |
----------------------------------
200 | Johnson | 10000 |
----------------------------------
300 | Mike | 11000 |
----------------------------------
400 | Adam | 12000 |
----------------------------------
500 | Tomyknoker | 10000 |
----------------------------------
所以在这里,首先,empid
被排序为 100, 200, 300, 400, 500
。
现在 empid
100
对应 Johnson -> 17000
而 200
对应 Johnson -> 10000
,所以一旦 empid 被排序,它将尝试排序 empname
明白了吗?
帮助您实现排序目标的 hack,也许您可以向 table 添加一个组字段,这样您就可以以更简洁的方式实现您想要的结果。
SELECT * FROM [PlanActual]
ORDER BY Phase, LEFT(Seq,1)
这可能接近您想要的:
SELECT t1.*
FROM PlanActual AS t1
INNER JOIN (
SELECT MIN(Seq) AS minSeq, Phase
FROM PlanActual
GROUP BY Phase
) AS t2 ON t1.Phase = t2.Phase
ORDER BY t2.minSeq