Sql server 从一组行中只选择一行返回?

Sql server 从一组行中只选择一行返回?,sql-server,tsql,Sql Server,Tsql,我正在使用AdventureWork2012数据库练习SQL,并创建了一个员工信息表。这是我的查询和结果 SELECT [e].[BusinessEntityID] , [e].[JobTitle] , CONCAT (p.FirstName, ' ', p.LastName) AS Full_Name , dep.Name AS Department

我正在使用AdventureWork2012数据库练习SQL,并创建了一个员工信息表。这是我的查询和结果

SELECT 
    [e].[BusinessEntityID]
    , [e].[JobTitle]
    , CONCAT (p.FirstName, ' ', p.LastName)             AS Full_Name
    , dep.Name                                          AS Department

    , DATENAME(dw, edh.StartDate) + ', ' +
      DATENAME(month, edh.StartDate) + ' ' +
      DATENAME(day, edh.StartDate) + ', ' +                 
      DATENAME(year, edh.StartDate)                     AS 'Start_Date'

    , CASE 
        WHEN edh.EndDate IS NULL
        THEN CONVERT(VARCHAR, GETDATE(), 101)       
        ELSE edh.EndDate
      END                                                                       AS End_Date

    , IIF(LEFT(pp.PhoneNumber, 3) = '1 (', ' ', LEFT(pp.PhoneNumber, 3))        AS Area_Code
    , eph.Rate

    , CASE CONVERT(CHAR(10), eph.PayFrequency)
        WHEN 2 THEN 'Biweekly'
        ELSE 'Weekly'
      END                                               AS PayFrequency

    , IIF(e.SalariedFlag = 1, 'Y', 'N')                 AS 'SalaryEmployee'

    , CASE 
        WHEN e.SalariedFlag = 1
        THEN ROUND((eph.Rate*40)*52, 2)
        ELSE NULL
      END                                               AS YearlySalary
--INTO EmpInfo

FROM [HumanResources].[Employee]    AS e
INNER JOIN  [HumanResources].[EmployeeDepartmentHistory] AS edh
    ON edh.BusinessEntityID = e.BusinessEntityID
INNER JOIN [Person].[Person] AS p 
    ON p.BusinessEntityId = e.BusinessEntityID
INNER JOIN [Person].[PersonPhone] AS pp
    ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN [HumanResources].[Department] AS dep
    ON dep.DepartmentID = edh.DepartmentID
INNER JOIN [HumanResources].[EmployeePayHistory] AS eph
    ON eph.BusinessEntityID = e.BusinessEntityID


ORDER BY e.BusinessEntityID;

正如你所看到的,罗布·沃尔特斯被列入名单6次,因为他作为一名员工获得了3次加薪,并且是两个部门的一员。有没有办法让我只返回Rob Walter所在的两个部门的最新/最高小时工资?

类似的情况应该非常接近。我删除了日期的格式,因为它真正属于前端。此外,您不希望将字符串文字用作列别名。它令人困惑,在sql server 2016中被弃用


像这样的东西应该很接近。我删除了日期的格式,因为它真正属于前端。此外,您不希望将字符串文字用作列别名。它令人困惑,在sql server 2016中被弃用


当然这很简单。您可以使用哪一列定义订单?开始日期?此外,您确实不应该在查询中设置日期格式。将格式保留在前端。@SeanLange因此我按
BusinessEntityID
对整个表进行排序,但是如果ID有重复的行,例如Rob Walters,我想我们可以使用
Rate
列来定义顺序?这样我们就可以取最大值,这很简单。您可以使用哪一列定义订单?开始日期?此外,您确实不应该在查询中设置日期格式。将格式保留在前端。@SeanLange因此我按
BusinessEntityID
对整个表进行排序,但是如果ID有重复的行,例如Rob Walters,我想我们可以使用
Rate
列来定义顺序?这样我们就可以取最大值了谢谢。但有没有办法让两个部门的员工以最高的小时工资排成两行呢?当你的方法工作时,Rob Walter的工具设计行消失了。当然,只需在window函数的PARTITION BY子句中添加另一列即可。“按e.BusinessEntityID划分,e.Department”好的。谢谢,谢谢。但有没有办法让两个部门的员工以最高的小时工资排成两行呢?当你的方法工作时,Rob Walter的工具设计行消失了。当然,只需在window函数的PARTITION BY子句中添加另一列即可。“按e.BusinessEntityID划分,e.Department”好的。非常感谢。
BusinessEntityID    JobTitle    Full_Name   Department  Start_Date  End_Date Area_Code  Rate    PayFrequency    SalaryEmployee  YearlySalary
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1   Chief Executive Officer         Ken Sánchez  Executive      Saturday, February 15,  2003 2019-11-08  697  125.50    Biweekly    Y   261040.00
2   Vice President of Engineering   Terri Duffy  Engineering    Sunday, March 3, 2002   2019-11-08  819 63.4615 Biweekly    Y   131999.92
3   Engineering Manager Roberto Tamburello  Engineering Wednesday, December 12, 2001    2019-11-08  212 43.2692 Biweekly    Y   89999.94
4   Senior Tool Designer    Rob Walters  Engineering    Saturday, January 5, 2002   2004-06-30  612 8.62    Biweekly    N   NULL
4   Senior Tool Designer    Rob Walters  Engineering    Saturday, January 5, 2002   2004-06-30  612 23.72   Biweekly    N   NULL
4   Senior Tool Designer    Rob Walters  Engineering    Saturday, January 5, 2002   2004-06-30   612    29.8462 Biweekly    N   NULL
4   Senior Tool Designer    Rob Walters  Tool Design     Thursday, July 1, 2004  2019-11-08  612    8.62    Biweekly    N   NULL
4   Senior Tool Designer    Rob Walters  Tool Design     Thursday, July 1, 2004  2019-11-08  612    23.72   Biweekly    N   NULL
4   Senior Tool Designer    Rob Walters  Tool Design    Thursday, July 1, 2004   2019-11-08  612    29.8462  Biweekly   N   NULL
5   Design Engineer Gail Erickson   Engineering     Wednesday, February 6, 2002  2019-11-08  849    32.6923  Biweekly   Y   67999.98
select *
from 
(
    SELECT 
        [e].[BusinessEntityID]
        , [e].[JobTitle]
        , CONCAT (p.FirstName, ' ', p.LastName) AS Full_Name
        , dep.Name AS Department
        , Start_Date = isnull(edh.StartDate, getdate())
        , End_Date = isnull(edh.EndDate, getdate())
        , IIF(LEFT(pp.PhoneNumber, 3) = '1 (', ' ', LEFT(pp.PhoneNumber, 3)) AS Area_Code
        , eph.Rate
        , CASE CONVERT(CHAR(10), eph.PayFrequency)
            WHEN 2 THEN 'Biweekly'
            ELSE 'Weekly'
          END AS PayFrequency
        , IIF(e.SalariedFlag = 1, 'Y', 'N')                 AS SalaryEmployee
        , CASE 
            WHEN e.SalariedFlag = 1
            THEN ROUND((eph.Rate*40)*52, 2)
            ELSE NULL
          END                                               AS YearlySalary
        , RowNum = ROW_NUMBER()over(partition by e.BusinessEntityID order by edh.StartDate desc) --or whatever column makes sense here
    --INTO EmpInfo
    FROM [HumanResources].[Employee]    AS e
    INNER JOIN  [HumanResources].[EmployeeDepartmentHistory] AS edh
        ON edh.BusinessEntityID = e.BusinessEntityID
    INNER JOIN [Person].[Person] AS p 
        ON p.BusinessEntityId = e.BusinessEntityID
    INNER JOIN [Person].[PersonPhone] AS pp
        ON pp.BusinessEntityID = e.BusinessEntityID
    INNER JOIN [HumanResources].[Department] AS dep
        ON dep.DepartmentID = edh.DepartmentID
    INNER JOIN [HumanResources].[EmployeePayHistory] AS eph
        ON eph.BusinessEntityID = e.BusinessEntityID
) x
where x.RowNum = 1
ORDER BY x.BusinessEntityID;