У меня есть SQL-запрос, как показано ниже. Я хочу применить столбец DISTINCT
к Name
в этом запросе. Можете вы помочь мне?
SELECT Id,
ConflictCheckRequestIndividualId,
Name,
Surname,
it.IndividualType AS IndividualType,
JobTitle,
RegistrationNumber,
Title,
District,
Status,
CreatedBy,
Created,
ModifiedBy,
Modified
FROM ConflictCheckItoIndividual
LEFT JOIN @IndividualTypes it
ON it.IndividualId = ConflictCheckRequestIndividualId
WHERE ConflictCheckRequestIndividualId IN
(SELECT Id
FROM ConflictCheckRequestIndividual
WHERE ConflictCheckRequestId = @ConflictId
AND SubStatus = 2)
минимальный воспроизводимый пример — отличное начало для запроса помощи по SQL.
Какие СУБД вы используете?
@jarlh достаточно только одной строки, я покажу другие данные, нажав кнопку. Я использую сервер Microsoft SQL
Просто поймите, что означает ваш запрос: вы получаете случайный набор данных для 1 конкретного имени, но если это достаточно хорошо для вас в данный момент, этот код должен делать:
select * from (
SELECT
ROW_NUMBER() over (partition by Name order by Id) [row],
Id,
ConflictCheckRequestIndividualId,
Name,
Surname,
it.IndividualType AS IndividualType,
JobTitle,
RegistrationNumber,
Title,
District,
Status,
CreatedBy,
Created,
ModifiedBy,
Modified
FROM ConflictCheckItoIndividual
LEFT JOIN @IndividualTypes it
ON it.IndividualId = ConflictCheckRequestIndividualId
WHERE ConflictCheckRequestIndividualId IN
(SELECT Id
FROM ConflictCheckRequestIndividual
WHERE ConflictCheckRequestId = @ConflictId
AND SubStatus = 2)) data
where [row] = 1
Вы дадите мне знать, если это работает для вас?
Два способа с немного разными результатами. «ГРУППИРОВАТЬ ПО Х» — это еще один способ сказать «Дайте мне по одной строке на каждый Х». Вам нужно будет применить функцию агрегации к каждой другой строке, чтобы она знала, как сжать строки в 1:
SELECT MAX(Id),
MAX(ConflictCheckRequestIndividualId),
Name,
MAX(Surname),
MAX(it.IndividualType) AS IndividualType,
MAX(JobTitle),
MAX(RegistrationNumber),
MAX(Title),
MAX(District),
MAX(Status),
MAX(CreatedBy),
MAX(Created),
MAX(ModifiedBy),
MAX(Modified)
FROM ConflictCheckItoIndividual
LEFT JOIN @IndividualTypes it
ON it.IndividualId = ConflictCheckRequestIndividualId
WHERE ConflictCheckRequestIndividualId IN
(SELECT Id
FROM ConflictCheckRequestIndividual
WHERE ConflictCheckRequestId = @ConflictId
AND SubStatus = 2)
GROUP BY Name
Это может привести к тому, что данные для каждого поля будут поступать из разных строк. Если вы хотите, чтобы все данные поступали из одной строки, вы можете сделать это
;WITH cte AS
(
SELECT Id,
ConflictCheckRequestIndividualId,
Name,
Surname,
it.IndividualType AS IndividualType,
JobTitle,
RegistrationNumber,
Title,
District,
Status,
CreatedBy,
Created,
ModifiedBy,
Modified,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Modified DESC) as rownum
FROM ConflictCheckItoIndividual
LEFT JOIN @IndividualTypes it
ON it.IndividualId = ConflictCheckRequestIndividualId
WHERE ConflictCheckRequestIndividualId IN
(SELECT Id
FROM ConflictCheckRequestIndividual
WHERE ConflictCheckRequestId = @ConflictId
AND SubStatus = 2)
)
SELECT * FROM cte WHERE rownum = 1
Это «разделение» данных на одно ведро для каждого имени. В каждом сегменте строки упорядочиваются по Modified в порядке убывания. Затем мы выбираем только одну строку из каждой корзины — самую последнюю измененную.
Кроме того, учитывая, что есть поле «Имя» и «Фамилия», я бы также ожидал группировки по этому
Спасибо, я использовал первый запрос, и это сработало!
Какой результат вы ожидаете от имени, которое существует несколько раз? (Т.е. имеет несколько строк - с разными данными.)