Удалить дублирующийся результат по запросу - PullRequest
0 голосов
/ 17 февраля 2020

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

Мой запрос:

SELECT DISTINCT ON(tickets.ticket_id,ticket_histories.created_at)
        ticket.id AS ticket_id,
        tickets.priority,
        tickets.title,
        tickets.company,
        tickets.ticket_statuse,
        tickets.created_at AS created_ticket,
        group_user.id AS group_id,
        group_user.name AS user_group,
        ch_history.description AS ch_description,
        ch_history.created_at AS ch_history
      FROM
        tickets
      INNER JOIN company ON (company.id = tickets.company_id)
      INNER JOIN (SELECT id,
        tickets_id,
        description,
        user_id,
        MAX(tickets.created_at) AS created_ticket
       FROM
        ch_history
       GROUP BY id,
        created_at,
        ticket_id,
        user_id,
        description
      ORDER BY created_at DESC LIMIT 1) AS ch_history ON (ch_history.ticket_id = ticket.id)
      INNER JOIN users ON (users.id = ch_history.user_id)
      INNER JOIN group_users ON (group_users.id = users.group_user_id)
      WHERE company = 15
      GROUP BY
        tickets.id,
        ch_history.created_at DESC;

Результат моего запроса, но возвращает 3 или 5 идентичных идентификаторов с разными историями. Я хочу вернуть только 1 идентификатор каждого тикета и только последнюю записанную историю каждого тика

 ticket_id | priority |                title                | company_id | ticket_statuse |       created_ticket       |                     company                          |  user_group     | group_id |     ch_description      |        ch_history       
            -----------+------------+--------------------------------------+------------+-----------------+----------------------------+------------------------------------------------------+-----------------+----------+------------------------+----------------------------
                 49713 |          2 | REMOVE DATA                       |      1 | t               | 2019-12-09 17:50:35.724485 | SAME COMPANY                                         | people          |        5 | TEST 1                  | 2019-12-10 09:31:45.780667
                 49706 |          2 | INCLUDE DATA                      |      1 | f               | 2019-12-09 09:16:35.320708 | SAME COMPANY                                         | people          |        5 | TEST 2                  | 2019-12-10 09:38:52.769515
                 49706 |          2 | ANY TITLE                         |      1 | f               | 2019-12-09 09:16:35.320708 | SAME COMPANY                                         | people          |        5 | TEST 3                  | 2019-12-10 09:39:22.779473
                 49706 |          2 | NOTING ELSE MAT                   |      1 | f               | 2019-12-09 09:16:35.320708 | SAME COMPANY                                         | people          |        5 | TESTE 4                 | 2019-12-10 09:42:59.50332
                 49706 |          2 | WHITESTRIPES                      |      1 | f               | 2019-12-09 09:16:35.320708 | SAME COMPANY                                         | people          |        5 | TEST 5                  | 2019-12-10 09:44:30.675434

хотел вернуться, как показано ниже

 ticket_id | priority |                title                | company_id | ticket_statuse |       created_ticket       |                     company                       |  user_group     | group_id |     ch_description      |        ch_history       
-----------+------------+--------------------------------------+------------+-----------------+----------------------------+------------------------------------------------------+-----------------+----------+------------------------+----------------------------
     49713 |          2 | REMOVE DATA                       |      1 | t               | 2019-12-09 17:50:10.724485 | SAME COMPANY                                         | people          |        5 | TEST 1                  | 2020-01-01 18:31:45.780667
     49707 |          2 | INCLUDE DATA                      |      1 | f               | 2019-12-11 19:22:21.320701 | SAME COMPANY                                         | people          |        5 | TEST 2                  | 2020-02-05 16:38:52.769515
     49708 |          2 | ANY TITLE                         |      1 | f               | 2019-12-15 07:15:57.320950 | SAME COMPANY                                         | people          |        5 | TEST 3                  | 2020-02-06 07:39:22.779473
     49709 |          2 | NOTING ELSE MAT                   |      1 | f               | 2019-12-16 08:30:28.320881 | SAME COMPANY                                         | people          |        5 | TESTE 4                 | 2020-01-07 11:42:59.50332
     49701 |          2 | WHITESTRIPES                      |      1 | f               | 2019-12-21 11:04:00.320450 | SAME COMPANY                                         | people          |        5 | TEST 5                  | 2020-01-04 10:44:30.675434

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

1 Ответ

1 голос
/ 17 февраля 2020

Две вещи выскакивают у меня:

  1. Вы перечислили "созданный в" как часть вашего "отдельного включения", которое по своей сути даст вам несколько строк на идентификатор билета (если только не один)

  2. Отдельное включение должно сделать подзапрос в истории заявок ненужным ... и даже если вы решили сделать это таким образом, вы снова перейдя в столбец «создан в», который даст вам несколько результатов. Идеальным подзапросом, если бы вы выбрали этот подход, была бы группировка по ticket_id и только ticket_id.

Немного связано:

Альтернативным подходом к подзапросу может быть функция analyti c (оконная функция), но я сохраню это на другой день.

Я думаю, что вы хотите запрос, который будет дать вам по одной строке на ticket_id, в зависимости от поля созданной таблицы истории будет что-то вроде этого:

select distinct on (t.id)
  <your fields here>
from
  tickets t
  join company c on t.company_id = c.id
  join ch_history ch on ch.ticket_id = t.id
  join users u on ch.user_id = u.ud
  join group_users g on u.group_user_id = g.id
where
  company = 15
order by
  t.id, ch.created_at  -- this is what tells distinct on which record to choose
...