【问题标题】:how to fetch top distinct data in sqlserver如何在sql server中获取最重要的不同数据
【发布时间】:2012-01-10 09:24:13
【问题描述】:

我有一个名为employee_salary 的表,包含三列:empsal_idempsal_nameempsal_sal。数据如下:

empsal_id empsal_name empsal_sal 1滴14000 2 桑托什 20000 3 米特 32000 4滴22000 5 米特 38000 6 桑托什 25000 7 地利 30000

empsal_id 是一个标识列,其种子和增量为 1,并且是主键。我想返回每个员工的姓名和当前工资。工资可以减也可以加,所以现在不一定是最高的。

所以我需要以下输出:

empname emp_sal 滴滴 30000 阿米特 38000 桑托什 25000

我正在使用 Microsoft SQL Server,我必须在单个查询中完成此操作。

【问题讨论】:

  • 工资会下降吗?如果有,您在该表中是否还有其他字段?
  • 为什么是dilip 32000而不是3000?他们排序的列的名称是什么?桌上有pk吗?
  • 我不明白“dilip 32000 而不是 3000”
  • 你怎么知道最近的工资是多少?
  • 每一行都有一个唯一的id,每行插入新记录时总是增加,即recid,可以用来获取数据

标签: sql sql-server sql-server-2008


【解决方案1】:

此查询将返回每个员工以及他们的最高薪水:

    SELECT
        empsal_name, MAX(empsal_sal)
    FROM
        employee
    GROUP BY
        empsal_name

这个查询将返回每个员工,以及他们当前的薪水(即最高的薪水empsal_id:

    SELECT
        empsal_name, empsal_sal
    FROM
        employee e1
    WHERE
        empsal_id =
            (SELECT MAX(empsal_id)
             FROM employee e2
             WHERE e1.empsal_name=e2.empsal_name)

就个人而言,我认为您最好使用有效日期列(例如empsal_effectivedate)来确定哪个记录是最新的,因此此查询将返回每个员工以及他们当前的工资(即工资与最近的empsal_effectivedate),假设有一个empsal_effectivedate 字段:

    SELECT
        empsal_name, empsal_sal
    FROM
        employee e1
    WHERE
        empsal_effectivedate =
            (SELECT MAX(empsal_effectivedate)
             FROM employee e2
             WHERE e1.empsal_name=e2.empsal_name)

【讨论】:

  • 不确定工资会不会增加可能会减少,我必须获取当前数据
【解决方案2】:

假设表中还有一个 ID,并且假设这个 ID 越大,您可以为该员工提供的最新工资

SELECT DISTINCT
    e.empname,
    (SELECT TOP 1 
        emp_sal 
    FROM 
        employee s
    WHERE 
        s.empname = e.empname 
    ORDER BY 
        recid DESC) AS emp_sal
FROM
    employee e

还假设 empname 对员工来说是唯一的


因为有很多假设:您可能应该发布表格的所有列以及它们的含义..

【讨论】:

  • 更新了答案以使用问题 cmets 中建议的 recid 名称..
  • @user571616 , unique 我的意思是没有两个名为 dilip 的员工。所有dilip 名称均指同一个人..
【解决方案3】:
SELECT empname, MAX(emp_sal) 
FROM   employee
GROUP BY  empname

更新:

SELECT DISTINCT EmpA.empname, 
                EmpA.emp_sal
FROM Employee AS EmpA 
     INNER JOIN ( SELECT  EmpName, MAX(recID) AS recid 
                  FROM Employee 
                  GROUP BY EmpName
                ) AS EmpB ON EmpA.recid = EmpB.recid;

【讨论】:

  • 不确定工资会不会增加,可能会减少,我必须获取当前数据
  • 那么你需要一个日期字段。
  • 你获取当前数据的依据是什么?
  • 每一行都有一个唯一的id,每行插入新记录时总是增加,即recid,可以用来获取数据
【解决方案4】:

您需要一个日期字段来确定最新插入的行。如果该表链接到其中包含日期列的其他表。那么它很容易获取当前数据。 例如

    Employee Table 
    {
    EmpName varchar(30) PK,
    EmpAddress varchar(255) ,
    Company varchar(30),
    CurrentTimeStamp Datetime
    }

    Salary Table 
    {
    EmpName varchar(30) FK,
    EmpSalary int
    }

要获取最新记录,请使用 CTE 函数

    With LatestSal(EmpName ,EmpSalary)
    AS
    (
    Select row_number() over (PARTITION BY b.[EmpName], order by CurrentTimestamp DESC) as seq
    b.EmpName,b.EmpSalary
    From Employee as a,
    Salary as b
    on a.[EmpName]=b.[EmpName]
    ) 
    Select EmpName,EmpSalary 
    from LatestSal
    where seq=1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2020-07-02
    相关资源
    最近更新 更多