Member 13057140 Ответов: 1

Как выбрать только одну строку, которая имеет два разных значения в одном столбце


Всем Привет,
Мне нужна ваша помощь для SQL. У меня есть такой стол, как;

Статус ID TestID
1 2 паса
1 2 не
2 3 не
2 3 пройти
3 4 не
4 5 сдать

Я хочу вернуть только одну строку для каждого идентификатора. Если ID уже не получится, возвращать только записи с ошибкой, поэтому outout должен выглядеть;

Статус ID TestID
1 2 не
2 3 не
3 4 не
4 5 сдать

Что я уже пробовал:

Я пробовал использовать CTE и Temp delete и он работает нормально но я хотел сделать то же самое с помощью Joins;

Создать таблицу #tmp
(
Идентификатор Инт,
grpid int,
пас варчар(10)
)

Вставить в #tmp (Id,grpid,pass)
Значения (1,2,'Pass'),
(1,2,'ошибка'),
(2,3,"неудача"),
(2,3,"пас"),
(3,2,"пас"),
(4,2,"неудача")

--Выберите * из #tmp

;С TempEmp (Id,grpid,pass,duplicateRecCount)
АС
(
Выберите ID,grpid,сдать,функции row_number() над(раздел по ID,grpid заказа пропуска)
Как duplicateRecCount
Из #tmp
)
Выберите * в #tmp1 из TempEmp

Выберите * из #tmp1

--Теперь Удалите Дубликаты Записей
Удалить из #tmp1
Где duplicateRecCount > 1

Выберите * из #tmp1

Tomas Takac

Вам не нужно вставлять в #tmp1 и удалять. Просто выберите Id,grpid,pass from TempEmp WHERE duplicateRecCount = 1. В качестве альтернативы вы можете сделать это с помощью union.

1 Ответов

Рейтинг:
0

CHill60

Как заявил @Tomas-Takac, вам не нужно использовать #tmp1 и удалять, просто сделайте что-то вроде

WITH TempEmp (Id,grpid,pass,duplicateRecCount)
 AS
 (
	SELECT Id,grpid,pass, 
	  ROW_NUMBER() OVER(PARTITION by Id,grpid ORDER BY pass) AS duplicateRecCount
	FROM #tmp
 )
 Select Id,grpid,pass from TempEmp WHERE duplicateRecCount = 1
Но вы сказали, что хотите использовать соединение. Одним из способов может быть использование содержимого вашего CTE в качестве подзапроса. например
SELECT A.Id, A.grpid, A.pass
FROM #tmp A
INNER JOIN (SELECT Id,grpid,pass,ROW_NUMBER() OVER(PARTITION by Id,grpid ORDER BY pass) 
          AS duplicateRecCount FROM #tmp) 
   as B ON B.duplicateRecCount = 1 AND A.Id = B.Id AND A.pass = B.pass