Выбрать все из таблицы, где 2 столбца различны

#sql #sql-server

#sql #sql-сервер

Вопрос:

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

 Col ID || Col Title || Col Price || Col Source
a b c d
a b c b
b a a c
b a a 1
  

Ожидаемый результат:

 a b c d
b a a c
  

Я не уверен, использовать ли здесь distinct или group by, любые предложения будут оценены

Приветствия

Скотт

=======================

Глядя на некоторые из ваших предложений, мне придется переосмыслить это, спасибо, ребята

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

1. Почему вы хотели abcd, а не abcb?

2. Как бы вы узнали, какой Source использовать, поскольку в вашем примере для каждого было бы по 2?

3. У вас не может быть «всей таблицы» и «название и цена должны быть разными» одновременно

4. Подумайте об этом сейчас, мне нужно было бы учесть и третий столбец, хорошо, мне придется переосмыслить это

Ответ №1:

При этом будет произвольно выбрана одна из строк для каждой отдельной пары (цена, название)

 ;WITH myCTE AS
(
    SELECT
       *,
       ROWNUMBER() OVER (PARTITION BY Price, Title ORDER BY Source) AS rn
    FROM
       MyTable
) 
SELECT
    *
FROM
    myCTE
WHERE
    rn = 1
  

Ответ №2:

Вы можете использовать group by, но для возврата только title и price, ID и source должны быть проигнорированы

Ответ №3:

Вы запрашиваете всю таблицу, но в вашем примере вывода вы потеряли две записи и, таким образом, потеряли значение ‘Col Source’.

 a b c b
b a a 1
  

Группировка по поможет вам написать очень простой запрос

 select id, title, price, source from table group by title, price
  

Ответ №4:

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

Вы должны выбрать GROUP BY как все столбцы, требуемые в вашем результирующем наборе. Однако DISTINCT вернет только уникальный список определенного столбца.

 SELECT ID, Title, Price, Source 
FROM table as t 
GROUP BY Title, Price