SQL 查询 - 尝试返回包含先前记录和当前记录的结果的记录

Posted

技术标签:

【中文标题】SQL 查询 - 尝试返回包含先前记录和当前记录的结果的记录【英文标题】:SQL query - trying to return records that contains results from previous records and the current records 【发布时间】:2020-05-06 09:08:07 【问题描述】:

所以我的表(表 A)包含显示员工向谁报告的记录。 当一个人更改“报告至”时,它将更新表格并显示旧值和新值。我正在努力编写一个 SQL 查询来返回旧雇主和新雇主。

表A

-----------------------------------------------------------------------  
ID    |Date                           |Employee |Reports To  |Command
-----------------------------------------------------------------------   
1     |2020-05-05 09:32:56.193        |EMP0        |EMP1      OLD
-----------------------------------------------------------------------   
2     |2020-05-05 09:39:56.193        |EMP0        |EMP2      NEW
-----------------------------------------------------------------------   
3     |2020-05-05 11:32:56.193        |EMP0        |EMP2      OLD
-----------------------------------------------------------------------   
4     |2020-05-05 11:38:56.193        |EMP0        |EMP3      NEW
-----------------------------------------------------------------------   
5     |2020-05-05 19:32:56.193        |EMP0        |EMP3      OLD
 -----------------------------------------------------------------------   
6     |2020-05-05 19:35:56.193        |EMP0        |EMP2      NEW
------------------------------------------------------------------------   

我想返回的结果:

------------------------------------------------------------   
ID    |Employee |Currently Reports To |Previously Reported To
-------------------------------------------------------------  
1      EMP0         EMP2               EMP1  
-------------------------------------------------------------  
2      EMP0         EMP3               EMP2      
-------------------------------------------------------------
3      EMP0         EMP2               EMP3      
------------------------------------------------------------- 

我尝试过的 SQL 查询:

SELECT Employee, tb1.[Reports To] FROM Table A tb1 JOIN Table A tb2
ON tb1.Employee =tb2.Employee AND tb1.Reports To <> tb2.Reports To
AND tb2.Command = 'OLD'
WHERE tb1.Command = 'NEW'```

【问题讨论】:

这个查询有什么问题? (除了应该是SELECT tb1.ID, tb1,Employee, tb1.[Reports To] , tb2.[Reports To] 的选择部分) 【参考方案1】:

如果“旧”和“新”记录正确交错,您可以使用lead()lag()

select
    employee,
    reports_to     as currently_reports_to,
    lag_reports_to as previously_reported_to
from (
    select t.*, lag(reports_to) over(partition by employee order by date, id) lag_reports_to
    from mytable t
) t
where command = 'NEW'

【讨论】:

@GMB 。 . .我认为如果您使用as 作为列别名,您的代码会更容易阅读。我也对这个解决方案犹豫不决,因为时间戳完全相同。这意味着结果不稳定。 @GordonLinoff:谢谢。我添加了第二个排序标准。【参考方案2】:

你也可以使用apply

select row_number() over (order by t.date) as id,
       t.employee, t.reportsto as CurrentlyReportsTo, t1.reportsto as PreviouslyReportsTo
from table t cross apply
     ( select top (1) t1.reportsto
       from tab;e t1
       where t1.employee = t.employee and t1.command = 'OLD' and t1.date <= t.date
       order by t1.date desc
     ) t1
where t.command = 'NEW';

【讨论】:

【参考方案3】:

您的行具有完全相同的时间戳。这也允许您使用聚合:

select employee,
       max(case when command = 'NEW' then reports_to end) as current_reports_to,
       max(case when command = 'OLD' then reports_to end) as previously_reports_to
from t
group by employee, timestamp;

【讨论】:

以上是关于SQL 查询 - 尝试返回包含先前记录和当前记录的结果的记录的主要内容,如果未能解决你的问题,请参考以下文章

计算与先前记录的差异

SQL 使用两个提前 16 个月的日期字段返回记录

如何在sql中插入记录时返回id(id为自动增长)

SQL 返回另一个日期前 18 个月的所有记录(到月底)

如何在 Oracle 中查找 SQL 查询中返回的记录的内存大小?

SQL查询以获取未来的日期记录(ALL)以及当前的日期记录