Удаление дублированных полей SQL на основе historyId

#sql #select #duplicates

#sql #выберите #дубликаты

Вопрос:

У меня есть база данных с повторяющимися значениями. В частности, SiteCode, LastName, FirstName, DateOfService, Payer, BilledAmount, NetReceivable и ContractualDiscount объединяются для формирования записей, которые повторяются неоднократно по всей этой таблице.

Я хотел бы удалить все, кроме одного экземпляра этих полей, и пытаюсь сделать это, выбрав только один NetBilledHistoryID (который является уникальным полем для каждой записи в таблице).

К сожалению, когда я запускаю этот запрос, я все равно получаю дублированные значения.

Как я могу исправить это, чтобы мой запрос select устранил эти дубликаты? Или, что еще лучше, я должен использовать другую технику запроса все вместе?

 SELECT * 
FROM [Reports].[dbo].[NetBilledHistory] t1
WHERE EXISTS ( 
                SELECT 1 FROM [Reports].[dbo].[NetBilledHistory] AS t2
                WHERE t2.SiteCode = t1.SiteCode
                AND t2.LastName = t1.LastName
                AND t2.FirstName = t1.FirstName
                AND t2.DateofService = t1.DateofService
                AND t2.Payer = t1.Payer
                AND t2.BilledAmount = t1.BilledAmount
                AND t2.NetReceivable = t1.NetReceivable
                AND t2.ContractualDiscount = t1.ContractualDiscount
                AND t2.NetBilledHistoryID < t1.NetBilledHistoryID)
 

Ответ №1:

вы можете добиться этого с помощью CTE :

 WITH cte_query AS (
    SELECT ROW_NUMBER() OVER(
        partition by SiteCode, LastName, FirstName,
            DateofService, Payer, BilledAmount, NetReceivable,
            ContractualDiscount
        order by NetBilledHistoryID) AS RowNum, *
  FROM [Reports].[dbo].[NetBilledHistory]
)

SELECT * FROM cte_query where RowNum = 1;
 

отрегулируйте по мере необходимости в соответствии с вашими целями для столбцов и т. Д.

Комментарии:

1. кстати, это для sql 2005 и выше