基于HistoryID删除SQL重复字段

基于HistoryID删除SQL重复字段,sql,select,duplicates,Sql,Select,Duplicates,我有一个重复值的数据库。具体来说,SiteCode、LastName、FirstName、DateofService、Payer、BilledAmount、NetReceived和ContractualDiscont连接起来,形成在整个表中重复出现的记录 我想删除这些字段的所有实例,但只删除一个实例,并尝试通过只选择一个NetBilledHistoryID(这是表中每个记录的唯一字段)来实现 不幸的是,当我运行这个查询时,仍然会得到重复的值 如何更正此问题,以便我的select查询消除这些重复项

我有一个重复值的数据库。具体来说,SiteCode、LastName、FirstName、DateofService、Payer、BilledAmount、NetReceived和ContractualDiscont连接起来,形成在整个表中重复出现的记录

我想删除这些字段的所有实例,但只删除一个实例,并尝试通过只选择一个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)
选择*
来自[Reports].[dbo].[NetBilledHistory]t1
存在的地方(
从[Reports].[dbo].[NetBilledHistory]中选择1作为t2
其中t2.SiteCode=t1.SiteCode
和t2.LastName=t1.LastName
t2.FirstName=t1.FirstName
t2.DateofService=t1.DateofService
t2.付款人=t1.付款人
t2.biledamount=t1.biledamount
t2.netreceives=t1.netreceives
和t2.contractualdiscont=t1.contractualdiscont
和t2.netbiledhistoryid
您可以通过使用
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;

根据需要进行调整,以适合列等的用途。

顺便说一句,这适用于sql 2005及以上版本