基于两列值的sql排序

Posted

技术标签:

【中文标题】基于两列值的sql排序【英文标题】:sql order by based on two columns values 【发布时间】:2021-04-22 02:08:19 【问题描述】:
ID name src
1 sundaresh 1111
2 altos 2222
3 anand 1111
4 gautham 3333
5 mahindra 1111
6 Tata 3333
7 Narayan 3333
8 Satya 1111
9 Shiv 2222
10 Ratan 2222

正如我在上表中提到的,我需要检索如下结果。 (例如 'name' 列与类似的 'src' 列按升序过滤)

ID name src
2 altos 2222
10 Ratan 2222
9 Shiv 2222
3 anand 1111
5 mahindra 1111
8 Satya 1111
1 sundaresh 1111
4 gautham 3333
7 Narayan 3333
6 Tata 3333

能够按相似的'src'列和对应的'name'列升序检索数据

SELECT * From Table Order by src,name ASC

【问题讨论】:

能否解释一下排序背后的逻辑我不明白 我也是,为什么1111在2222之后3333之前? 逻辑似乎是“按名称排序,但在具有该值的第一个行之后直接添加具有相同 src 的所有行”。所以 altos anandgautham 按名称排序。但在gautham 之前添加与altos 具有相同值的所有行 【参考方案1】:

如果您使用的是 mysql 8.0+,您可以使用 MIN() 窗口函数:

SELECT *
FROM tablename 
ORDER BY MIN(name) OVER (PARTITION BY src), 
         name

对于以前的版本,在 ORDER BY 子句中使用相关子查询:

SELECT t1.*
FROM tablename t1
ORDER BY (SELECT MIN(t2.name) FROM tablename t2 WHERE t2.src = t1.src), 
         name

请参阅demo。 结果:

ID name src
2 altos 2222
10 Ratan 2222
9 Shiv 2222
3 anand 1111
5 mahindra 1111
8 Satya 1111
1 sundaresh 1111
4 gautham 3333
7 Narayan 3333
6 Tata 3333

【讨论】:

以上是关于基于两列值的sql排序的主要内容,如果未能解决你的问题,请参考以下文章

sql:选择由另一列分组的两列值的计数并获得两个计数的比率

基于最后一列值的numpy排序数组[重复]

SQL:ORDER BY 两列混合,不基于优先级

SQL中升序排序字段为空值影响排序结果解决方法

基于单个列值的循环和插入 SQL

基于 SQL Server 2008 中列值的内部联接