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

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
-2
задан Strawberry 10 March 2019 в 02:20
поделиться

2 ответа

Вы можете попробовать следующее, если это работает для вас. Я также добавил ссылку на скрипту 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
ответ дан Winkey 10 March 2019 в 02:20
поделиться

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

0
ответ дан Gordon Linoff 10 March 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: