Несколько строк с несколькими значениями, как получить большее значение для одного и того же идентификатора строки
У меня есть данные, содержащиеся в моей базе данных SQL, о студентах и их карточках, которые они используют для входа в систему, иногда студенты теряют свою карточку, и у них есть еще одна, но одна и та же строка, которая содержит информацию о студенческой карте, не обновлялась , на самом деле была добавлена новая строка, поэтому мы получаем ситуацию:
Есть один ученик с двумя картами, и как я могу определить, какой из них более новый, потому что нет никакого столбца о «DateCreated» или smth …
Я также узнаю, вижу ли я более высокий CardId для того же студента, это означает, что «более высокий» номер в настоящее время является активной картой для пользователя, так как я могу удалить старый идентификатор.
- Эквивалент креста применяется и выбирает верхнюю
- Как вставить несколько операторов select в временную таблицу
- Простой SQL-запрос с выбором и группировкой по
- Как выбрать более одного уникального идентификатора?
- SQL select возвращает определенное количество строк
Вот фото:
Спасибо, ребята, Cheers
- Оператор CASE внутри предложения WHERE в SQL Server
- SQL добавляет новый столбец, чтобы проверить, появляется ли идентификатор в другой таблице
- Определить подмножество записей на основе даты и правил в SQL Server
- Как выбрать на основе пользовательского столбца
- Как выбрать последнюю отдельную запись в SQL SERVER
- Выбор строк после определенного текстового значения SQL Server
- Запрос на получение минимальной даты каждой записи
- Добавить строку в результат запроса с помощью select
Вы можете попробовать это
DELETE a FROM <your table name> a WHERE EXISTS (SELECT 1 FROM <your table name> b WHERE b.StudentId = a.StudentId AND b.CardId > a.CardId)
В этом запросе будут удалены все записи студентов, которые содержат другие записи, имеющие одинаковый StudentId, и значение CardId больше, чем CardId удаленной записи.
Если вы уверены, что более высокий идентификатор карты является действительным, вы можете реализовать триггер ниже в своей таблице, который автоматически удалит старые записи, когда вы вставляете строку в таблицу.
Create Trigger delete_old_record On <Your_Table_Name> After Insert AS delete from <Your_Table_Name> where [Student ID]=(select [Student ID] from Inserted ) and [Card_ID]<(select [Card_ID] from Inserted) Go
Один из подходов состоит в том, чтобы сделать самосоединение delete, используя CTE для идентификации записей, которые следует удалить. Запись должна быть удалена, если a) она отображается как пара для данного CardID
, и b) это минимальный CardID
для этого CardID
.
WITH cte AS ( SELECT StudentID, MIN(CardID) AS CardID FROM yourTable GROUP BY StudentID HAVING COUNT(*) > 1 -- only do a delete if a pair be present ) DELETE t1 FROM yourTable t1 INNER JOIN cte t2 ON t1.StudentID = t2.StudentID AND t1.CardID = t2.CardID