Функция GROUP BY отменяет DISTINCT

У меня есть SQL-запрос, который объединяет несколько таблиц и создает дубликаты в двух строках. Я использую ключевое слово DISTINCT для устранения дубликатов:

SELECT DISTINCT
          o.day as day,
          g.id AS id,
          g.name AS name,
          o.num AS num,
          o.version as version
        FROM
          table_one o
          INNER JOIN table_two t ON
            o.ID = t.ID
          INNER JOIN table_three g ON
            t.ID = g.ID
          INNER JOIN table_four gs ON
            g.ID = gs.ID
            AND
          INNER JOIN table_five s ON
            gs.ID = s.ID
          INNER JOIN table_six z ON
            s.ID = z.ID
          INNER JOIN table_seven bg ON
            bg.ID = g.ID;

Это возвращает две строки, как мне бы хотелось, иначе я бы увидел дубликаты, если бы не использовал DISTINCT:

1/2/19, 5, first, 25, 1
1/5/19, 7, second, 20, 1

Если я уберу DISTINCT, то две строки будут продублированы, что даст мне четыре строки:

1/2/19, 5, first, 25, 1
1/2/19, 5, first, 25, 1
1/5/19, 7, second, 20, 1
1/5/19, 7, second, 20, 1

Итак, моя конечная цель — использовать функцию GROUP BY, чтобы я мог сложить свое поле o.num и сгруппировать их по остальным полям. Если я добавлю функцию GROUP BY к приведенному выше запросу, например:

SELECT DISTINCT
          o.day as day,
          g.id AS id,
          g.name AS name,
          SUM(o.num) AS num,
          o.version as version
        FROM
          table_one o
          INNER JOIN table_two t ON
            o.ID = t.ID
          INNER JOIN table_three g ON
            t.ID = g.ID
          INNER JOIN table_four gs ON
            g.ID = gs.ID
            AND
          INNER JOIN table_five s ON
            gs.ID = s.ID
          INNER JOIN table_six z ON
            s.ID = z.ID
          INNER JOIN table_seven bg ON
            bg.ID = g.ID
        GROUP BY
          o.day as day,
          g.id AS id,
          g.name AS name,
          o.version as version;

Я возвращаю две строки назад, но сумма o.num удваивается (по сути, выполняется GROUP BY без DISTINCT:

1/2/19, 5, first, 50, 1
1/5/19, 7, second, 40, 1

ПРИМЕЧАНИЕ. Вам может быть интересно, почему я пытаюсь использовать GROUP BY, когда получаю нужные результаты с первым запросом. Я включил только те строки, которые дублируются. По какой-то причине все остальные строки не видят этого поведения. Есть ли способ заставить GROUP BY и DISTINCT работать вместе?

ну… да, вы группируете исходный набор данных и используете сумму по дублированным значениям

Lamak 28.02.2019 20:49

@Lamak да, так что мой вопрос в том, как это исправить

Drew13 28.02.2019 20:50
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

select day, id, name, sum(num) num, version
from (
  -- your query here with DISTINCT clause 
)
group by day, id, name, version

Если вы получаете дубликаты, могут возникнуть проблемы с условиями присоединения. Мне не трудно судить, не знаю датасетов.

Вы можете использовать SUM(DISTINCT o.num):

SELECT o.day as day,
       g.id AS id,
       g.name AS name,
       SUM(DISTINCT o.num) AS num,
       o.version as version
FROM table_one o
INNER JOIN table_two t ON o.ID = t.ID
INNER JOIN table_three g ON t.ID = g.ID
INNER JOIN table_four gs ON g.ID = gs.ID
INNER JOIN table_five s ON gs.ID = s.ID
INNER JOIN table_six z ON s.ID = z.ID
INNER JOIN table_seven bg ON bg.ID = g.ID
GROUP BY o.day as day,
         g.id AS id,
         g.name AS name,
         o.version as version;

Другие вопросы по теме