sql - 从另一个表中选择具有最大日期的数据

标签 sql select sql-server-2014 maxdate

我需要有关 SELECT 查询的帮助,在该查询中我需要加入另一个表并获取具有最大日期的记录。我创建了示例来演示。我的最后一个 SELECT 不正确,我需要指导来修复它,或者 Sql server 2014 中是否有更好的方法

CREATE TABLE #EmpTable
(
    EmpNum INT,
    colA VARCHAR(5) NULL,
    colB VARCHAR(5) NULL
)

CREATE TABLE #EmpDetailTbl
(
    EmpNum INT,
    Name VARCHAR(10),
    Department VARCHAR(10) NULL,
    ReportDate DATETIME NOT NULL
)

INSERT INTO #EmpTable 
VALUES (101, 'val11', 'Val21'), (102, 'val12', 'Val21'), (103, 'val13', 'Val23');

INSERT INTO #EmpDetailTbl 
VALUES (101, 'emp101', 'Dept1', '05/01/2018'), (101, 'emp101', 'Dept2', '06/01/2018'),
       (101, 'emp101', 'Dept1', '05/01/2017'), (102, 'emp102', 'Dept3', '04/01/2018'),
       (102, 'emp102', 'Dept1', '05/01/2018')

--select * from  #EmpDetailTbl
--select * from  #EmpTable

SELECT 
    a.EmpNum, Name, ColA, ColB, Department
FROM 
    #EmpTable a
LEFT OUTER JOIN
    #EmpDetailTbl b ON a.EmpNum = b.EmpNum 
                    AND ReportDate = (SELECT MAX(ReportDate) 
                                      FROM #EmpDetailTbl 
                                      a.EmpNum = b.EmpNum)

最佳答案

使用 rank() 分析函数根据报告日期枚举行,然后仅选择每个员工的第一个:

SELECT EmpNum, Name, ColA, ColB, Department
FROM (
  SELECT 
    a.EmpNum, b.Name, a.ColA, a.ColB, b.Department,
    rank() over (partition by a.EmpNum order by b.ReportDate desc) as rn
  FROM #EmpTable a
  LEFT JOIN #EmpDetailTbl b ON 
    a.EmpNum = b.EmpNum
  ) t
WHERE rn = 1;

此查询将处理关系:如果同一日期的员工有超过 1 条记录(而且恰好是最大值),它将显示所有记录。

关于sql - 从另一个表中选择具有最大日期的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50916455/

相关文章:

sql - SQL LEFT JOIN返回0而不是NULL

c++ - 增加网关的负载能力

sql - 具有连续日期范围记录的数据集中的最小和最大日期的日期范围

SQL - 返回已删除的行

.net - SQL物理连接不可用

sql-server - Identity(主键聚集)表中的间隙是否会影响数据库的性能?

java - 将数据与用户分开的最佳做法是什么

php - SQL Update else Insert 不工作

sql - xp_smtp_sendmail 空格随机添加到html

带有 JOIN 和 WHERE 子句的 MySQL 查询不起作用