【问题标题】:SELECT data from another table with max date从具有最大日期的另一个表中选择数据
【发布时间】:2018-06-19 04:38:07
【问题描述】:

我需要 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)

【问题讨论】:

  • 想要的输出?
  • 每个 EmpNum 一个记录,最大(ReportDate)

标签: sql select sql-server-2014 maxdate


【解决方案1】:

使用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 条记录,并且恰好也是最大值,它将显示所有记录。

【讨论】:

    【解决方案2】:

    如果我理解正确,你可以试试这个来获取 MaxDate 行。

    使用exists 通过EmpNum 获取MAX(b1.ReportDate)

    select a.EmpNum, Name, ColA, ColB, Department
    FROM #EmpTable a
    LEFT JOIN #EmpDetailTbl b on a.EmpNum = b.EmpNum 
    WHERE exists (
        SELECT 1
        FROM #EmpDetailTbl b1
        WHERE b1.EmpNum = b.EmpNum
        GROUP BY b1.EmpNum
        HAVING MAX(b1.ReportDate) = b.ReportDate
    )
    

    sqlfiddle:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=a3deade95dbd25d9cadadee37e16d9c6

    结果

    EmpNum  Name    ColA    ColB    Department
    101    emp101   val11   Val21   Dept2
    102    emp102   val12   Val21   Dept1
    103    emp103   val13   Val23   Dept1
    

    【讨论】:

    • 该示例按预期工作,但是,在我的实际查询中,即使使用 LEFT JOIN 或 LEFT OUTER JOIN,我也没有从 #EmpTable 获取所有行。你能想出一个理由吗?
    • 它应该从`#EmpTable` 中获取所有行,因为LEFT JOIN,如果不能,您能否提供一些数据以及现在的结果集和您的预期结果? @银鱼
    • 我认为这是由于内部 SQL 中的 WHERE 子句充当 INNER JOIN。我尝试用 Right Join 替换,但结果仍然不一致。我将尝试创建测试数据来模拟问题
    • 请查看更新的示例。我从 #EmpDetailTbl 中删除了 emp103 以证明左连接不起作用。现在它只会返回 EmpNum 101, 102 而不是 103 即使使用左连接
    • 根据您的预期结果,您需要使用UNION ALL 来组合 Maxdate 结果和没有关联的 EMPID 结果集 dbfiddle.uk/…@SilverFish
    【解决方案3】:

    ReportDate 应该是 a.ReportDate

    【讨论】:

    • a 没有作为 ReportDate 的列
    • 是的,但 b 有报告日期,然后写 b.reportdate。我的意思是给对应列的表别名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2017-07-26
    • 2013-10-26
    • 2022-02-07
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多