仅返回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与前一行不同)
答案 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子句中的其他条件也会返回该行。
虽然我提供了一个解决方案,但我必须质疑为什么要这样做,如果给出更多信息,可能有更好的方法来满足您的解决方案,返回有变化的每一行似乎可能导致更大的事情。如果您可以提供有关您正在做的事情的更多信息,那么可能会找到更好的解决方案。