Удалить повторяющуюся запись, если она содержит определенное значение в столбце - PullRequest
0 голосов
/ 06 августа 2020

Допустим, у меня есть эта таблица:

Student | Task | Result  | Reason
Jim     | 3    | Success | NULL
Jim     | 4    | Success | NULL
John    | 3    | Success | NULL
John    | 2    | Failed  | Task finished too late
Bill    | 5    | Success | NULL
Bill    | 7    | Failed  | Not enough knowledge
Bill    | 6    | Unknown | Asked StackOverflow to do his homework

Я хочу отфильтровать успешные задачи каждого ученика здесь, ЕСЛИ сказал, что у ученика есть одна или несколько неудачных или неизвестных задач. Если они не потерпели неудачу / вообще ничего неизвестно, мне нужно увидеть только успешные.

Итак, мой ожидаемый результат будет:

Student | Task | Result  | Reason
Jim     | 3    | Success | NULL
Jim     | 4    | Success | NULL
John    | 2    | Failed  | Task finished too late
Bill    | 7    | Failed  | Not enough knowledge
Bill    | 6    | Unknown | Asked StackOverflow to do his homework

Я пробовал использовать группу by и MIN (Результат), но тогда я получаю одну запись независимо от успеха / неудачи.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Это довольно простой вариант использования оконной функции, на которую ссылается Common Table Expression (CTE):

Query

declare @t table(Student varchar(10),Task int,Result varchar(10),Reason varchar(50));
insert into @t values('Jim' ,3,'Success',NULL),('Jim' ,4,'Success',NULL),('John',3,'Success',NULL),('John',2,'Failed ','Task finished too late'),('Bill',5,'Success',NULL),('Bill',7,'Failed ','Not enough knowledge'),('Bill',6,'Unknown','Asked StackOverflow to do his homework');

with s as
(
    select *
          ,sum(case when Result <> 'Success' then 1 else 0 end) over (partition by Student) as NonSuccesses
    from @t
)
select Student
      ,Task
      ,Result
      ,Reason
from s
where Result <> 'Success'
    or NonSuccesses = 0;

Output

+---------+------+---------+----------------------------------------+
| Student | Task | Result  |                 Reason                 |
+---------+------+---------+----------------------------------------+
| Bill    |    7 | Failed  | Not enough knowledge                   |
| Bill    |    6 | Unknown | Asked StackOverflow to do his homework |
| Jim     |    3 | Success | NULL                                   |
| Jim     |    4 | Success | NULL                                   |
| John    |    2 | Failed  | Task finished too late                 |
+---------+------+---------+----------------------------------------+
0 голосов
/ 08 августа 2020

объявить таблицу @t (Student varchar (10), Task int, Result varchar (10), Reason varchar (50)); вставить в значения @t ('Jim', 3, 'Success', NULL), ('Jim', 4, 'Success', NULL), ('John', 3, 'Success', NULL), ('John ', 2,' Ошибка ',' Задача завершена слишком поздно '), (' Билл ', 5,' Успех ', NULL), (' Счет ', 7,' Ошибка ',' Недостаточно знаний '), (' Билл ', 6,' Неизвестно ',' Попросил StackOverflow выполнить домашнее задание ');

; с as (выберите ученика, подсчитайте (отдельный результат) cn из группы @t по ученику) выберите * из ab присоединиться к @t c на b.Student = c .Student, где cn = 1 или Result <> 'success'

--- или

select * from @t, где Result <> «Успех» или «Студент в группе» (выберите «Студент из группы @t», если студент имеет счет (отдельный результат) = 1)

...