我有以下表单中的数据,我想根据我必须在usernames
数组中找到的特定user_id
对user_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会有一些最简单的方法。这个结构只是一个例子。
答案 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]