#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