仅返回字段数据存在差异的记录

时间:2012-01-17 20:36:55

标签: sql toad

仅返回FTE或职位名称字段存在差异的记录。

我有一份员工数据表,其中包括员工#,工作#,开始日期FTE和职位。对于每个员工和工作,我只想返回FTE或职位发生变化的记录

Record,Employee#,Job#,Start Date,   FTE,Position  
1,     1000,    01, 01/01/2011, 100,    A  
2,     1000,    01, 01/06/2011, 100,    A  
3,     1000,    01, 01/07/2011, 80,     B  
4,     1000,    01, 01/08/2011, 80,     C  
5,     1000,    01, 01/10/2011, 80,     C  
6,     1000,    02, 01/01/2011, 20,     A  
7,     1000,    02, 01/05/2011, 20,     A  
8,     1000,    02, 01/08/2011, 20,     B   

查询应返回记录1,3,4,6,8。 (这些是唯一的记录是FTE和Position与前一行不同)

2 个答案:

答案 0 :(得分:0)

这看起来像是一个典型的自我加入场景:您需要再次查询您的表格,看看是否有一个具有不同FTE或位置的早期记录。

这样的事情(不,我没试过这个):

select later.* 
from 
  my_table as later, 
  my_table as earlier -- same table again
where
  later.employee = earlier.employee -- the self-join
  and
  later.date > earlier.date -- lest we see changes twice
  and
  later.FTE != earlier.FTE -- the change
;

答案 1 :(得分:0)

取决于您使用的数据库。如果你使用的是Oracle,那么下面应该可以解决这个问题:

SELECT *
FROM (
  SELECT
    record
  , employee#
  , job#
  , start_date
  , fte
  , LAG(fte) OVER (ORDER BY record) previous_row_fte
  , position
  , LAG(position) OVER (ORDER BY record) previous_row_position
  FROM scott.stack_overflow_employee
)
WHERE fte != previous_row_fte
OR position != previous_row_position
OR previous_row_fte IS NULL
OR previous_row_position IS NULL

在子查询中,您可以看到使用Oracle分析函数LAG - 可以找到关于此问题的好文章here。此函数按“记录”排序行,然后选择前一行fte或position。在外部查询中,如果当前fte不等于前一行fte或与position相同,则WHERE子句指定仅返回行的条件。此外,由于oracle处理NULL值的方式,如果任一值为NULL,WHERE子句中的其他条件也会返回该行。

虽然我提供了一个解决方案,但我必须质疑为什么要这样做,如果给出更多信息,可能有更好的方法来满足您的解决方案,返回有变化的每一行似乎可能导致更大的事情。如果您可以提供有关您正在做的事情的更多信息,那么可能会找到更好的解决方案。