查找上次更新时间和上次更新日期

时间:2015-06-30 03:07:45

标签: sql sql-server

我被告知要为以下场景提出解决方案。

我需要返回"最后更新日期"和"最后更新者"基于" EmployeeID"的列。查询必须在Parent和所有Child表中搜索最新条目,并返回按ID分组的列。我正在寻找一种解决方案,而不使用UNION ALL来连接父表和子表,以及一个处理可以由两个不同用户在不同表上的相同EmployeeID(外键或主键)上输入最新记录的场景的解决方案。

E.g。 Jim今天更新了Employee表的EmployeeID 1,Paul还更新了EmployeeID 1的Employee_Address表。基于EmployeeID 1有两条记录,其最后更新日期是今天由不同用户输入的。

请参阅schema和Union ALL脚本,我无法找出它的Last Last By部分。

CREATE TABLE EMPLOYEE
(
  EMPLOYEE_ID INT,
  NAME VARCHAR(100),
  LAST_UPDATED_BY VARCHAR(200),
  LAST_UPDATED_DT DATE
)

CREATE TABLE EMPLOYEE_AWARD
(
  AWARD_ID INT,
  EMPLOYEE_ID INT,
  AWARD_NAME VARCHAR(100),
  LAST_UPDATED_BY VARCHAR(200),
  LAST_UPDATED_DT DATE
)

CREATE TABLE EMPLOYEE_ADDRESS
(
  ADDRESS_ID INT,
  EMPLOYEE_ID INT,
  "ADDRESS" VARCHAR(100),
  LAST_UPDATED_BY VARCHAR(200),
  LAST_UPDATED_DT DATE
)


INSERT INTO EMPLOYEE
    VALUES  (1,'Paul Smith', 'GomesR', '6/22/2015'),
            (2,'Francis Jones', 'KellyR', '5/20/2013'),
            (3,'Paul Bo', 'GomesR', '11/09/2015'),
            (4,'Ed Li', 'TurnerR', '1/19/2012')


INSERT INTO EMPLOYEE_AWARD
    VALUES  (10,1,'Employee of the Month', 'GomesR', '6/22/2015'),
            (20,3,'Employee of the Month', 'KellyR', '5/20/2013'),
            (30,1,'Employee of the Quater', 'GomesR', '11/09/2015'),
            (40,3,'Employee of the Month', 'TurnerR', '1/19/2012'),
            (50,2,'Employee of the Month', 'KellyR', '11/11/2011')


INSERT INTO EMPLOYEE_ADDRESS

    VALUES  (100,1,'Address 1','GomesR', '6/25/2015'),
            (200,2,'Address 2','TurnerR', '5/28/2015'),
            (300,3,'Address 3','TurnerR', '11/20/2015'),
            (400,4,'Address 4','GomesR', '6/14/2014')



SELECT      D.EMPLOYEE_ID, Max(D.LAST_UPDATED_DT) LAST_UPDATED_DT--, D.LAST_UPDATED_BY
FROM        EMPLOYEE A

INNER JOIN  (   SELECT      EMPLOYEE_ID, LAST_UPDATED_DT, LAST_UPDATED_BY
                FROM        EMPLOYEE 
                UNION ALL
                SELECT      EMPLOYEE_ID, LAST_UPDATED_DT, LAST_UPDATED_BY
                FROM        EMPLOYEE_AWARD 
                UNION ALL
                SELECT      EMPLOYEE_ID, LAST_UPDATED_DT, LAST_UPDATED_BY
                FROM        EMPLOYEE_ADDRESS

                ) AS D

ON A.EMPLOYEE_ID = D.EMPLOYEE_ID
GROUP BY D.EMPLOYEE_ID

2 个答案:

答案 0 :(得分:0)

如果在2个不同的表上,这将为同一员工返回2行2个不同的用户根据需要在同一天更新了员工。

select employee_id,
       last_updated_dt,
       last_updated_by
  from (select x.*,
               max(last_updated_dt) over(partition by employee_id) as max_last_updated_dt
          from (select employee_id,
                       last_updated_dt,
                       last_updated_by
                  from employee
                union all
                select employee_id,
                       last_updated_dt,
                       last_updated_by
                  from employee_award
                union all
                select employee_id,
                       last_updated_dt,
                       last_updated_by
                  from employee_address) x) x
 where last_updated_dt = max_last_updated_dt

小提琴:http://sqlfiddle.com/#!3/a4503c/1/0

您不应该避免使用union all。数据位于三个不同的表中,因此这是union all的适当应用。

答案 1 :(得分:0)

为什么要使用UNION ALLJOIN s会很好地完成你的工作。

SELECT e.employee_id,
       e.last_updated_dt AS employee_update_date,
       e.last_updated_by AS employee_update_user,
       aw.last_updated_dt AS awards_update_date,
       aw.last_updated_by AS awards_update_user,
       ad.last_updated_dt AS address_update_date,
       ad.last_updated_by AS address_update_user
FROM employee e
LEFT JOIN employee_awards aw ON e.employee_id = aw.employee_id
LEFT JOIN address ad ON e.employee_id = ad.employee_id

我已经使用LEFT JOIN来获得稳健性,因为我假设并非所有员工都在所有表格中都有条目。

相关问题