Как выбрать записи без дубликатов только на одном столбце в SQL? - PullRequest
0 голосов
/ 10 марта 2019

У меня есть таблица с 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

Мне нужна категория Промышленность без дубликатов.Какова лучшая команда SQL, чтобы сделать это?

Ответы [ 2 ]

3 голосов
/ 10 марта 2019

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

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
0 голосов
/ 10 марта 2019

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

...