首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL对每一行中的列进行排序,并根据

SQL对每一行中的列进行排序,并根据
EN

Stack Overflow用户
提问于 2013-09-10 12:44:02
回答 4查看 1.3K关注 0票数 2

我可以使用什么SQL select查询对每一行进行排序,然后对已排序的行进行排序?

表标签(c1,c2,c3,c4)

代码语言:javascript
运行
复制
2,5,8,4
2,1,6,7
5,2,9,3

查询必须提供:

代码语言:javascript
运行
复制
1,2,6,7
2,3,5,9
2,4,5,8
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-10 13:12:48

代码语言:javascript
运行
复制
SELECT
MIN(c1, c2, c3, c4) AS new_c1,
CASE MIN(c1, c2, c3, c4) WHEN c1 THEN MIN(c2, c3, c4)
                         WHEN c2 THEN MIN(c1, c3, c4)
                         WHEN c3 THEN MIN(c1, c2, c4)
                         WHEN c4 THEN MIN(c1, c2, c3)
                         END AS new_c2,
CASE MAX(c1, c2, c3, c4) WHEN c1 THEN MAX(c2, c3, c4)
                         WHEN c2 THEN MAX(c1, c3, c4)
                         WHEN c3 THEN MAX(c1, c2, c4)
                         WHEN c4 THEN MAX(c1, c2, c3)
                         END AS new_c3,
MAX(c1, c2, c3, c4) AS new_c4
FROM tab
ORDER BY new_c1, new_c2, new_c3, new_c4
  • 看到它在木琴中工作
  • 参见这里中的min()max()函数

引用:

注意,max()和min()是一个简单的函数,当它有两个或更多的参数时,但是如果只给出一个参数,则作为聚合函数运行。

票数 2
EN

Stack Overflow用户

发布于 2013-09-10 13:04:07

这只是一些开始,也许不是最“干净”的代码,但它会起作用

代码语言:javascript
运行
复制
SELECT CASE WHEN C1 < C2 THEN 
                CASE WHEN C1 < C3 THEN C1 ELSE C3 END
            ELSE
                CASE WHEN C2 < C3 THEN C2 ELSE C3 END
       END

From YourTable

这将首先选择最小的元素。再来三个,你就可以走了。获得此结果集后,可以按第一列进行排序。

票数 1
EN

Stack Overflow用户

发布于 2013-09-10 13:18:49

可能的解决办法:

代码语言:javascript
运行
复制
CREATE TEMPORARY TABLE nums2
(
   Row int,
   V int
);

INSERT INTO nums2
SELECT *     
FROM
(
    SELECT rowid Row, c1 V FROM nums
    UNION ALL
    SELECT rowid Row, c2 V FROM nums
    UNION ALL
    SELECT rowid Row, c3 V FROM nums
    UNION ALL
    SELECT rowid Row, c4 V FROM nums
) 
ORDER BY Row, V;

SELECT n1.V v1, n2.V v2, n3.V v3, n4.V v4
    FROM nums2 n1
    INNER JOIN nums2 n2 ON n1.Row = n2.Row AND n2.rowid = n1.rowid + 1
    INNER JOIN nums2 n3 ON n1.Row = n3.Row AND n3.rowid = n1.rowid + 2
    INNER JOIN nums2 n4 ON n1.Row = n4.Row AND n4.rowid = n1.rowid + 3
    WHERE ((n1.rowid - 1) % 4 = 0)
    ORDER BY n1.V, n2.V, n3.V, n4.V

它使用一个临时表(nums2)保存“线性化”行,并使用隐藏列rowid对行进行分组。

测试人员:http://sqlfiddle.com/#!7/d0232/38

最后一个选择可以简化一点:

代码语言:javascript
运行
复制
SELECT n1.V v1, n2.V v2, n3.V v3, n4.V v4
    FROM nums2 n1
    INNER JOIN nums2 n2 ON n2.rowid = n1.rowid + 1
    INNER JOIN nums2 n3 ON n3.rowid = n1.rowid + 2
    INNER JOIN nums2 n4 ON n4.rowid = n1.rowid + 3
    WHERE ((n1.rowid - 1) % 4 = 0)
    ORDER BY n1.V, n2.V, n3.V, n4.V

因为WHERE表达式将“选择”每一行的最低值。

测试人员:http://sqlfiddle.com/#!7/d0232/39

查询很容易扩展。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18719310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档