Как удалить строки с тремя одинаковыми столбцами данных и одним другим столбцом данных - PullRequest
0 голосов
/ 09 июля 2019

У меня есть таблица "MARK_TABLE", как показано ниже.

Как удалить строки с одинаковыми значениями "STUDENT", "COURSE" и "SCORE"?

| ID | STUDENT | COURSE | SCORE |
|----|---------|--------|-------|
| 1  |    1    |    1   |  60   |
| 3  |    1    |    2   |  81   |
| 4  |    1    |    3   |  81   |
| 9  |    2    |    1   |  80   |
| 10 |    1    |    1   |  60   |
| 11 |    2    |    1   |  80   |

Теперь я уже отфильтровал данные, которые хочу сохранить, но без "ID" ...

SELECT student, course, score FROM mark_table
INTERSECT
SELECT student, course, score FROM mark_table

Вывод:

| STUDENT | COURSE | SCORE |
|---------|--------|-------|
|    1    |    1   |  60   |
|    1    |    2   |  81   |
|    1    |    3   |  81   |
|    2    |    1   |  80   |

Ответы [ 5 ]

3 голосов
/ 09 июля 2019

Используйте следующий запрос для удаления нужных строк:

DELETE FROM MARK_TABLE M
WHERE
    EXISTS (
        SELECT
            1
        FROM
            MARK_TABLE M_IN
        WHERE
            M.STUDENT = M_IN.STUDENT
            AND M.COURSE = M_IN.COURSE
            AND M.SCORE = M_IN.SCORE
            AND M.ID < M_IN.ID
    )

ВЫХОД

enter image description here

db <> fiddle demo

Ура !!

0 голосов
/ 09 июля 2019

Использовать CTE с RowNumber

create table #MARK_TABLE (ID int, STUDENT  int, COURSE  int, SCORE  int)
insert into #MARK_TABLE 
values 
(1,1,1,60),
(3,1,2,81),
(4,1,3,81),
(9,2,1,80),
(10,1,1,60),
(11,2,1,80)

;with cteDeleteID as(
Select id, row_number() over (partition by student,course,score order by score) [row_number]  from #MARK_TABLE
)
delete from #MARK_TABLE where id in
(
 select id from cteDeleteID where [row_number] != 1
)

select * from #MARK_TABLE
drop table #MARK_TABLE    
0 голосов
/ 09 июля 2019
select * from
(
select row_number() over (partition by student,course,score order by score) 
rn,student,course,score from mark_table
) t
where rn=1
0 голосов
/ 09 июля 2019

Предполагая, что вы не хотите просто выбирать уникальные данные, которые хотите сохранить (вы упоминаете, что уже сделали это), вы можете действовать следующим образом:

  1. Создайте временную таблицу для хранения данных, которые вы хотите сохранить
  2. Вставьте данные, которые вы хотите сохранить во временную таблицу
  3. Очистить исходную таблицу
  4. Повторно вставьте данные, которые вы хотите сохранить, в исходную таблицу.
0 голосов
/ 09 июля 2019

использование distinct

SELECT distinct student, course, score FROM mark_table
...