SQL-基于另一列对特定列进行排序
我有以下形式的数据,我想根据我必须从SQL-基于另一列对特定列进行排序,sql,postgresql,Sql,Postgresql,我有以下形式的数据,我想根据我必须从用户id数组中找到的特定用户id对用户名列进行排序 usernames | empno | user_ids | ------------------+--------------------- { Akon, Den } | 11 | { 12, 13 } | { John, Nash } | 7 | { 15, 12 } | { Ahmad, Umar }| 9 | { 18, 1
用户id
数组中找到的特定用户id
对用户名列进行排序
usernames | empno | user_ids |
------------------+---------------------
{ Akon, Den } | 11 | { 12, 13 } |
{ John, Nash } | 7 | { 15, 12 } |
{ Ahmad, Umar }| 9 | { 18, 12 } |
例如,应首先显示user\u id
=12的用户名。结果如下所示
usernames | empno |
------------------+--------
{ Akon, Den } | 11 |
{ Nash, John } | 7 |
{ Umar, Ahmad }| 9 |
我相信在博士后会有一些最简单的方法来做到这一点。这个结构只是一个例子。好吧,这里最大的问题是您正在使用数组,这实际上使事情变得更加困难。如果您的数据库中确实没有规范化数据,则可以使用将其逐行和数组_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之前,您没有横向查询,也没有带有许多参数的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
这两种解决方案都假定两个数组中每行的元素数相同
如果代码没有运行,请告诉我(我实际上没有尝试过,因此可能有输入错误或逻辑问题)。@MuhamamdAwais如果您只对用户ID的第一个元素进行排序,
尝试以下操作:按用户id从您的\u表顺序中选择用户名,empno[1]
为什么一个用户id映射到多个用户名?逗号分隔的数据不是SQL方式,这种设计只会给您带来很多麻烦。。。(并使事情变得非常困难。)@jarlh根据我的数据库体系结构,我必须以CSV格式导出一些信息,因为我必须这样做。@vkp根据我的体系结构,我可以将一个用户名映射到多个用户名:)即使业务规则允许每个用户名有多个用户名,您的数据库设计也非常糟糕。搜索数据库规范化。