Как выбрать записи без дублирования только в одном столбце в SQL?

#mysql #sql #select #duplicates

#mysql #sql #выберите #дубликаты

Вопрос:

У меня есть таблица с 3 столбцами, подобными этому:

  ------------ --------------- -------   
| Industry      | country    | price |  
 ------------ --------------- -------   
Retail          |UK              | 20
Retail          | Japan          | 30
Retail          | Germany        | 40
Retail          | America        | 50
  

Мой желаемый результат примерно такой:

  ------------ --------------- -------   
| Industry      |    country  | price |  
 ------------ --------------- -------   
Retail         | UK             | 20
               | Japan          | 40
               | Germany        | 40
               | America        | 50
  

Мне нужно иметь категорию Industry без каких-либо дубликатов. Какая лучшая команда SQL для этого?

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

1. sql работает не так. Я полагаю, вы могли бы проявить творческий подход к оконным функциям и добиться желаемого формата. Однако Sql не предназначен для форматирования данных. Вам нужно найти инструмент отчетности / пакет, который форматирует данные в группировке так, как показывают ваши желаемые результаты.

Ответ №1:

Вы можете попробовать следующее, если это работает для вас. Я также добавил ссылку на SQL fiddle

http://sqlfiddle.com /#!4/d162a4/10

 select (case when row_id=1 then industry else ' ' end) industry
        ,country
        ,price
from (select industry,country
            ,price
            ,row_number() over(partition by industry order by rownum) row_id
      from prices
     ) tmp
  

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

1. Я вроде понимаю ответ, но в MySQL его нет rownum , поэтому положительные отзывы ставят меня в тупик.

2. @GordonLinoff, если вы проверите мой SQL fiddle, я использовал oracle 11g, и я не был уверен в вопросе, какой порядок является приоритетом, и просто использовал rownum, и если вы знаете приоритет порядка, мы можем заменить rownum столбцами, и я считаю, что это должно работать и в mysql

3. . . Я знаю, что SQL Fiddle использует Oracle. Вопрос помечен как «mysql». Я понимаю, что вы, возможно, не так чувствительны к тегам, будучи новым участником. Это положительные отзывы, которые я не получаю.

4. успокойтесь и расслабьтесь

Ответ №2:

Вы действительно хотите сделать это на уровне представления. Таблицы SQL и результирующие наборы представляют собой неупорядоченные наборы. Единственное исключение — когда конечный результат имеет order by . Поэтому вам нужно быть очень осторожным, чтобы защититься от перестановки.

Ваши данные, похоже, имеют самую низкую цену в первую очередь. Итак, в MySQL 8 или почти любой другой базе данных вы можете сделать:

 select (case when row_number() over (partition by industry order by price, country) = 1
             then industry
        end) as industry,
       country, price
from t
order by industry, price, country;
  

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

Позвольте мне повторить: Внешний order by имеет решающее значение для обеспечения того, чтобы данные были такими, как вы хотите. Без результата say может «выглядеть» правильно, но это может не сработать при следующем запуске запроса.

В более ранних версиях MySQL вы можете сделать то же самое, но это выглядит по-другому. Вы не отметили версию, поэтому я предполагаю, что это более свежая версия.