SQL - 根据另一列对特定列进行排序

时间:2016-08-29 12:48:53

标签: sql postgresql

我有以下表单中的数据,我想根据我必须在usernames数组中找到的特定user_iduser_ids列进行排序。

 usernames     | empno    |   user_ids |       
------------------+---------------------
{ Akon, Den }  |    11    | { 12, 13 } |
{ John, Nash } |     7    | { 15, 12 } |
{ Ahmad, Umar }|     9    | { 18, 12 } |

例如,应首先显示user_id = 12的用户名。结果如下所示

 usernames     | empno    |       
------------------+--------
{ Akon, Den }  |    11    |
{ Nash, John } |     7    |
{ Umar, Ahmad }|     9    |

我相信在Postgres会有一些最简单的方法。这个结构只是一个例子。

2 个答案:

答案 0 :(得分:1)

嗯,这里最大的问题是你正在使用数组,实际上使事情变得更加困难。如果您确实没有在数据库中对数据进行规范化,则可以使用unnest function逐行进行数组化,并使用array_agg来获取数组。如果您使用的是9.4+,则很容易:

SELECT
    t.empno,
    array_agg(u.username ORDER BY u.user_id) AS username_agg,
    array_agg(u.user_id ORDER BY u.user_id) AS user_id_agg
FROM
    your_table t,
    unnest(t.usernames, t.user_ids) AS u(username, user_id)
GROUP BY
    t.empno
ORDER BY
    user_ids_agg

在9.4之前,你没有LATERAL查询,unnest也没有参数,所以会有点困难:

SELECT
    t.empno,
    array_agg(t.username ORDER BY t.user_id) AS username_agg,
    array_agg(t.user_id ORDER BY t.user_id) AS user_id_agg
FROM
    (
        SELECT
            t1.empno,
            unnest(t1.usernames) AS username,
            unnest(t1.user_ids) AS user_id
        FROM
            your_table t1
    ) t
GROUP BY
    t.empno
ORDER BY
    user_ids_agg

两种解决方案都假设每行的两个数组中都有相同数量的元素。

如果代码没有运行,请告诉我(我实际上没有尝试过,所以可能存在拼写错误或逻辑问题)。

答案 1 :(得分:0)

@MuhamamdAwais如果您只对user_ids的第一个元素进行排序, 试试这个:select usernames,empno from your_table order by user_ids[1]

相关问题