SQL применить отдельный столбец

У меня есть 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)

Какой результат вы ожидаете от имени, которое существует несколько раз? (Т.е. имеет несколько строк - с разными данными.)

jarlh 17.05.2022 15:11

минимальный воспроизводимый пример — отличное начало для запроса помощи по SQL.

jarlh 17.05.2022 15:12

Какие СУБД вы используете?

jarlh 17.05.2022 15:12

@jarlh достаточно только одной строки, я покажу другие данные, нажав кнопку. Я использую сервер Microsoft SQL

Mert POLAT 17.05.2022 15:18
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто поймите, что означает ваш запрос: вы получаете случайный набор данных для 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 в порядке убывания. Затем мы выбираем только одну строку из каждой корзины — самую последнюю измененную.

Кроме того, учитывая, что есть поле «Имя» и «Фамилия», я бы также ожидал группировки по этому

Спасибо, я использовал первый запрос, и это сработало!

Mert POLAT 17.05.2022 16:15

Другие вопросы по теме