2016-08-29 5 views
0

У меня есть данные в следующей форме, я хотел отсортировать столбец usernames на основе specfic user_id, который должен найти из массива user_ids.SQL - Сортировка конкретного столбца на основе другого столбца

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

Forexample, имена пользователей с user_id = 12 должны быть показаны в первую очередь. Результат будет выглядеть следующим образом:

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

Я уверен, что в Postgres будет самый простой способ сделать это. Эта структура является всего лишь примером.

+0

почему делает user_id карту на несколько USER_NAMES? –

+1

Данные, разделенные запятыми, не являются способом SQL, этот дизайн вызовет у вас массу проблем ... (И упростите работу очень сложно.) – jarlh

+0

@jarlh. Согласно моей архитектуре базы данных, мне нужно экспортировать некоторую информацию в CSV из-за того, что нужно сделать что-то подобное. –

ответ

1

Ну, самая большая проблема здесь в том, что вы работаете с массивами, на самом деле усложнять ситуацию. Если у вас действительно нет нормализованных данных в вашей базе данных, вы можете использовать unnest function, чтобы сделать это row-by-row и 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 у вас нет латерального запросов, ни 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 

Оба решения предположим, что у вас одинаковое количество элементов в обоих массивах для каждой строки.

Пожалуйста, дайте мне знать, если код не работает (я на самом деле не пытался, поэтому может быть проблема с опечатками или логикой).

0

@MuhamamdAwais, если вы будете только сортировать по первому элементу user_ids, попробовать это: select usernames,empno from your_table order by user_ids[1]

Смежные вопросы