Несколько строк с несколькими значениями, как получить большее значение для одного и того же идентификатора строки

У меня есть данные, содержащиеся в моей базе данных SQL, о студентах и ​​их карточках, которые они используют для входа в систему, иногда студенты теряют свою карточку, и у них есть еще одна, но одна и та же строка, которая содержит информацию о студенческой карте, не обновлялась , на самом деле была добавлена ​​новая строка, поэтому мы получаем ситуацию:

Есть один ученик с двумя картами, и как я могу определить, какой из них более новый, потому что нет никакого столбца о «DateCreated» или smth …

Я также узнаю, вижу ли я более высокий CardId для того же студента, это означает, что «более высокий» номер в настоящее время является активной картой для пользователя, так как я могу удалить старый идентификатор.

Вот фото: введите описание изображения здесь

Спасибо, ребята, Cheers

Вы можете попробовать это

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 
  • Как выбрать только первые строки для каждого уникального значения столбца
  • SQL Server - создание настраиваемого поля автоматического увеличения
  • Преобразование SQL Server выбирает столбец и преобразует его в строку
  • Подсчет событий между двумя сторонами на sql
  • Как вставить в таблицу, если значение не существует, но только для определенных критериев? (MS SQL Server)
  • В SQLServer можно выбрать несколько значений из одной таблицы и для каждого возвращаемого значения вставить строки в другую таблицу?
  • SQL-запрос SELECT FROM
  • Добавлен первый столбец в Select Case SQL, не может получить второе место
  • Максимальное количество сгруппированных элементов
  • выберите оператор CASE на основе двух таблиц
  • SQL Server - группа за днем ​​для верхнего N диапазона
  • Interesting Posts

    Обновление 100 тыс. Записей в одном запросе обновления

    Прочтите sql-запрос с помощью C #

    Преобразование базы данных доступа в базу данных MSSQL с помощью помощника по миграции Microsoft SQL Server для доступа

    Подсчитать счетчик на основе состояния SQL-сервера

    Может ли хранимая процедура MS / Transact-SQL искать собственное имя?

    Профайлер SQL-сервера не отображает запросы LINQ To Sql

    SQL Query занимает менее 1 секунды в SSMS и навсегда в коде

    Почему мой Scalar UDF funciton возвращает более одной строки?

    Что я могу сделать, чтобы использовать сеанс на сервере общедоступного хостинга с балансировкой нагрузки

    как изменить log_reuse_wait и log_reuse_wait_desc

    Как добавить значения по умолчанию в параметризованный запрос

    Общая производительность запросов SQL Server

    Использование таблицы перестановок для заполнения пробелов

    Обновление записей SQL на основе зарегистрированного выбора

    ЗАПОМНЕННАЯ ПРОЦЕДУРА Расчеты и повышение производительности

    Давайте будем гением компьютера.