Значения массива отображаются в строке за строкой для одного идентификатора с использованием Postgresql

#sql #postgresql

Вопрос:

Я пытаюсь отобразить значения массива с помощью запроса PostgreSQL, подобного этому, несколько значений отображаются в нескольких строках по одному идентификатору.

Стол:

 id     name     dept.
1      name1     xxxx
1      name2     yyyy
2      name3     zzzz
4      name4     zzzz
 

Получите ответ по идентификатору, необходимый для этой
таблицы:

 id      name      dept.
1       name1     xxxx
        name2     yyyy
2       name3     zzzz
3       name4     zzzz
 

Комментарии:

1. Зачем вам нужно все в один ряд? Почему бы вам не добавить строки на стороне клиента?

2. Поскольку запрос принимает значения очень быстро, на стороне клиента это будет происходить медленно, используя больше циклов, если это невозможно на стороне запроса, я выберу вариант на стороне клиента.

3. @MuhammedArif Я немного сбит с толку. Можете ли вы правильно отформатировать образец данных, чтобы мы могли видеть, как вы ожидаете, что набор результатов будет выглядеть?

4. Такой вид форматирования гораздо лучше выполняется на стороне клиента, когда вы отображаете данные в своем приложении. Время запроса определяется не только количеством строк, но и размером результата. И простое форматирование его немного по-другому не изменяет размер. Я сомневаюсь, что вы увидите какое-либо улучшение производительности, если сделаете это (возможно, даже более медленный запрос, поскольку базе данных теперь нужно только «отформатировать вывод», а не просто возвращать результат запроса напрямую).

5. Спасибо, Ext js используется на стороне клиента.

Ответ №1:

Вы хотите сгруппировать свои данные, поэтому место для поиска находится в [список агрегированных функций] (https://www.postgresql.org/docs/current/functions-aggregate.html), в данном случае это string_agg ( value text, delimiter text ) → text

Вы хотите объединить данные из имен и отделов, и вы хотите, чтобы имена и отделы были в отдельных строках, как показано в примере. Для этого E'n' следует использовать разделитель:

 SELECT
  id,
  string_agg(name, E'n') as names,
  string_agg(dept, E'n') as depts
FROM 
  data
GROUP BY
  id
ORDER BY
  id;
 

В ответе показано, как это сделать, а в комментариях объясняется, почему этого не следует делать. Теперь выбор за тобой.

ПРАВКА 1

Если вы предпочитаете сохранять количество записей и отображать идентификатор в первой строке группы, вам следует изучить функции окна. В частности, ОТСТАВАНИЕ.

 SELECT
  CASE 
    WHEN id IS DISTINCT FROM LAG(id) OVER(order by id) THEN id 
    ELSE null 
  END as id,
  name,
  dept
FROM 
  data
order by
  data.id;
 

sql сравнивает текущий идентификатор с идентификатором предыдущей строки и выводит его или нулевое значение.

Комментарии:

1. Это отображается в одном столбце и одной строке, как это имя:[name1,name2], отдел:[xxxx, гггг], мне нравится получать один столбец и несколько строк для одного идентификатора. если это возможно.

2. Пожалуйста, объясните, как вы хотите получить результат? Вы хотите, чтобы идентификатор отображался в первой строке группы, а не в других строках?

3. Да, идентификатор показывает только первую строку группы и не показывает другие строки (на основе значений одного массива).

4. спасибо, теперь все в порядке. Я сверюсь со своим контекстом.

5. Как можно объединить несколько таблиц, используя один идентификатор.