Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL对每行中的列进行排序,并基于此对行进行排序_Sql_Sqlite_Sorting_Select - Fatal编程技术网

SQL对每行中的列进行排序,并基于此对行进行排序

SQL对每行中的列进行排序,并基于此对行进行排序,sql,sqlite,sorting,select,Sql,Sqlite,Sorting,Select,我可以使用什么SQL select查询对每行进行排序,然后对已排序的行进行排序 例如:表格选项卡(c1、c2、c3、c4) 查询必须给出: 1,2,6,7 2,3,5,9 2,4,5,8 这只是一个开始,也许不是最“干净”的代码,但它会起作用 SELECT CASE WHEN C1 < C2 THEN CASE WHEN C1 < C3 THEN C1 ELSE C3 END ELSE CAS

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

例如:表格选项卡(c1、c2、c3、c4)

查询必须给出:

1,2,6,7
2,3,5,9
2,4,5,8

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

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
选择C1
这将首先选择最小的元素。 再来三杯,你就可以走了。。
一旦你有了这个结果集,你就可以按第一列排序了。

这只是一个开始,也许不是最“干净”的代码,但它可以工作

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
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
选择C1
这将首先选择最小的元素。 再来三杯,你就可以走了。。 获得此结果集后,可以按第一列排序

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()[and min()]是一个简单函数,当它有2个或更多个参数时,但如果仅给定一个参数,则作为聚合函数运行

  • 看到它在一个小房间里工作吗
  • 有关
    min()
    max()
    函数,请参阅
引述:

请注意,max()[和min()]是一个简单的函数,如果它有两个或多个参数,但如果只提供一个参数,则作为聚合函数运行

可能的解决办法:

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
将行分组

测试人员:

最后一个选择可以稍微简化:

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
表达式将“选择”每行的最低值

测试人员:

查询很容易扩展

可能的解决方案:

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
将行分组

测试人员:

最后一个选择可以稍微简化:

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
表达式将“选择”每行的最低值

测试人员:


查询很容易扩展

您可以将表格转换为
(行、列、值)
格式。然后,您可以对其进行排序,并将其解压回
(行号,val1,val2,val3,val4)
格式

; with  with_numbers as 
        (
        select  row_number() over (order by c1) rn
        ,       *
        from    tab
        )
,       normalized(rn, nr) as 
        (
        select  rn, c1 from with_numbers
        union all
        select  rn, c2 from with_numbers
        union all
        select  rn, c3 from with_numbers
        union all
        select  rn, c4 from with_numbers
        )
,       normalized_with_number as
        (
        select  row_number() over (partition by rn order by nr) rn2
        ,       *
        from    normalized
        )
,       sorted as
        (
        select  max(case when rn2 = 1 then nr end) c1
        ,       max(case when rn2 = 2 then nr end) c2
        ,       max(case when rn2 = 3 then nr end) c3
        ,       max(case when rn2 = 4 then nr end) c4
        from    normalized_with_number
        group by
                rn      
        )
select  *
from    sorted
order by
        c1
,       c2
,       c3
,       c4

您可以将表格转换为
(行、列、值)
格式。然后,您可以对其进行排序,并将其解压回
(行号,val1,val2,val3,val4)
格式

; with  with_numbers as 
        (
        select  row_number() over (order by c1) rn
        ,       *
        from    tab
        )
,       normalized(rn, nr) as 
        (
        select  rn, c1 from with_numbers
        union all
        select  rn, c2 from with_numbers
        union all
        select  rn, c3 from with_numbers
        union all
        select  rn, c4 from with_numbers
        )
,       normalized_with_number as
        (
        select  row_number() over (partition by rn order by nr) rn2
        ,       *
        from    normalized
        )
,       sorted as
        (
        select  max(case when rn2 = 1 then nr end) c1
        ,       max(case when rn2 = 2 then nr end) c2
        ,       max(case when rn2 = 3 then nr end) c3
        ,       max(case when rn2 = 4 then nr end) c4
        from    normalized_with_number
        group by
                rn      
        )
select  *
from    sorted
order by
        c1
,       c2
,       c3
,       c4

在应用程序层,而不是数据库中进行操作。@Yosi:ORDER BY
易于使用,但我不知道如何对每个应用程序中的列进行排序row@slashmais如果列的数量是固定的(并且很小),那么一个非常复杂的
案例可以解决这个问题。只有24种可能的四列排序(4!):-):-)也许您可以使用
交叉应用创建一些复杂的查询,但我认为这几乎是不可能的。可能您需要调用外部编程来完成这项工作。@fancyPants:我正在使用sqlite数据库浏览器&希望它可以通过查询完成,而不必编写应用程序。请在应用程序层而不是数据库中完成。@Yosi:Easy-use
ORDER BY
,但我不知道如何对每一行中的列进行排序row@slashmais如果列的数量是固定的(并且很小),那么一个非常复杂的
案例可以解决这个问题。只有24种可能的四列排序(4!):-):-)也许您可以使用
交叉应用创建一些复杂的查询,但我认为这几乎是不可能的。可能您需要调用外部编程来完成这项工作。@fancyPants:我使用的是sqlite数据库浏览器&希望它可以通过查询完成,而不必编写应用程序。这会使比较变得有点烦人,但概念是一样的。会使比较变得有点烦人,但这是同一个概念。他要求使用SQLite,所以没有CTE和
行号
:-):-)@xanatos:haha。。。德拉特。我觉得我很聪明:DHe要求使用SQLite,所以没有CTE和
行号
:-):-)@xanatos:haha。。。德拉特。我觉得我很聪明:D