Sql server T-SQL Over Partition子句

Sql server T-SQL Over Partition子句,sql-server,tsql,Sql Server,Tsql,我试图从这个sql中删除行。这些倍数是由于内部联接中的Contact表造成的。某些PID具有多行ContactType。例如,PID“123”可能有两行表示“EPH”,但数字不同。我们只想退回第一个。我想我应该使用一个过分区,但我似乎不能让它正常工作 SELECT UPPER(p.LastName) AS 'Last Name' ,UPPER(p.FirstName) AS 'First Name' ,UPPER(p.NickName)

我试图从这个sql中删除行。这些倍数是由于内部联接中的Contact表造成的。某些PID具有多行ContactType。例如,PID“123”可能有两行表示“EPH”,但数字不同。我们只想退回第一个。我想我应该使用一个过分区,但我似乎不能让它正常工作

SELECT  UPPER(p.LastName) AS 'Last Name'
              ,UPPER(p.FirstName) AS 'First Name'
              ,UPPER(p.NickName) AS 'Nick Name'
              ,p.CC AS 'Cost Center ID'
              ,UPPER(cc.DBA) AS 'Cost Center'
              ,UPPER(mbs.Title) AS 'Title'
              ,UPPER(a.City) AS 'City'
              ,UPPER(s.Code) AS 'State'
              ,a.ZipCode AS 'Zip Code'
              ,c1.Number AS 'Home Number'
              ,c2.Number AS 'Personal Cell'
              ,c3.Number AS 'Work Cell'
              ,p.PID

FROM Personnel p WITH (NOLOCK)
       JOIN mbs_Employee mbs WITH (NOLOCK)
              ON mbs.PID = p.PID
       JOIN CostCenter cc WITH (NOLOCK)
              ON cc.CostCenterCode = p.CC
       JOIN Address a WITH (NOLOCK)
              ON a.PID = p.PID
       JOIN ref_State s WITH (NOLOCK)
              ON s.StateId = a.StateId
       LEFT JOIN Contact c1 WITH (NOLOCK)
              ON c1.PID = p.PID
                     AND c1.ContactType = 'EHP'
       LEFT JOIN Contact c2 WITH (NOLOCK)
              ON c2.PID = p.PID
                     AND c2.ContactType = 'EOT'
       LEFT JOIN Contact c3 WITH (NOLOCK)
              ON c3.PID = p.PID
                     AND c3.ContactType = 'EWC'
WHERE Termination IS NULL
更新 我最终将Contact的连接更改为

 INNER JOIN ( SELECT  Number
    ,PID
    ,ContactType
FROM    ( SELECT    Number
                    ,PID
                    ,ContactType
                    ,ROW_NUMBER() OVER ( PARTITION BY ContactType ORDER BY Number DESC ) AS rn
            FROM      Contact
                            ) c3
            WHERE   c3.rn = 1
                  ) r3 ON r3.PID = p.PID
AND r3.ContactType = 'EWC'

在(按p.PID顺序按1划分)r上选择行号()<代码> R=1 < /代码>如果你找到了问题的答案,请考虑删除它或回答你自己的问题并接受答案。这样人们就会知道问题已经解决了。