如何删除重复记录并仅使用具有最高版本号的记录

时间:2015-11-13 15:24:06

标签: select sql-server-2005 group-by distinct

我想只为每个VariableName返回一条记录,它需要是最高版本号。我尝试过GROUP BY和DISTINCT,但似乎没什么用。

我有这个SQL代码

    SELECT Docs.DocID
      ,Filename
      ,VName
      ,VText
      ,RevNo
  FROM Docs
  INNER JOIN VarVal ON Docs.DocID = VarVal.DocID
  INNER JOIN Vars ON Vars.VarID = VarVal.VarID
  WHERE Docs.DocID in (
                                    select DocID
                                    from Docs
                                    INNER JOIN VarVal on Docs.DocID = VarVal.DocID
                                    INNER JOIN Var on Var.VarID = VarVal.VarID
                                    where VarName = '07'
                                    and ValueText = '801016'
                                )
  AND Docs.Deleted = 0
  AND Var.IsDeleted = 0
  ORDER BY VName

产生这个结果 this is the query result

2 个答案:

答案 0 :(得分:0)

SELECT Docs.DocID
  ,Filename
  ,VName
  ,VText
  ,(Select Top 1 RevNo
    Where 
    Docs.DocID = D.Docs.DocID And
    VName=D.VName And
    VText = D.Vtext
    From Docs
    Order by RevNo 
    )

FROM Docs as D
INNER JOIN VarVal ON Docs.DocID = VarVal.DocID
INNER JOIN Vars ON Vars.VarID = VarVal.VarID
WHERE Docs.DocID in (
                                select DocID
                                from Docs
                                INNER JOIN VarVal on Docs.DocID = VarVal.DocID
                                INNER JOIN Var on Var.VarID = VarVal.VarID
                                where VarName = '07'
                                and ValueText = '801016'
                            )
AND Docs.Deleted = 0
AND Var.IsDeleted = 0
ORDER BY VName

答案 1 :(得分:0)

您可以使用窗口功能:

;with cte as(
SELECT Docs.DocID
      ,Filename
      ,VName
      ,VText
      ,RevNo
      ,row_number(partition by Docs.DocId, FileName order by RevNo desc) rn
  FROM Docs
  INNER JOIN VarVal ON Docs.DocID = VarVal.DocID
  INNER JOIN Vars ON Vars.VarID = VarVal.VarID
  WHERE Docs.DocID in (
                                    select DocID
                                    from Docs
                                    INNER JOIN VarVal on Docs.DocID = VarVal.DocID
                                    INNER JOIN Var on Var.VarID = VarVal.VarID
                                    where VarName = '07'
                                    and ValueText = '801016'
                                )
  AND Docs.Deleted = 0
  AND Var.IsDeleted = 0)
select * from cte
where rn = 1