【问题标题】:SQL - Sort specific column based on another columnSQL - 根据另一列对特定列进行排序
【发布时间】:2016-08-29 12:48:52
【问题描述】:

我有以下形式的数据,我想根据我必须从 user_ids 数组中找到的特定 user_idusernames 列进行排序。

 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 中会有一些最简单的方法来做到这一点。这个结构只是一个例子。

【问题讨论】:

  • 为什么一个user_id会映射到多个user_names?
  • 逗号分隔的数据不是 SQL 方式,这种设计只会给你带来很多麻烦......(并且让简单的事情变得非常困难。)
  • @jarlh 根据我的数据库架构,我必须以 CSV 格式导出一些信息,因为必须这样做。
  • @vkp 根据我的架构,我可以将一个 user_id 映射到多个用户名:)
  • 即使业务规则允许每个 user_id 有多个用户名,您的数据库设计也很差。搜索数据库规范化。

标签: sql postgresql


【解决方案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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      相关资源
      最近更新 更多