我通过Oracle使用SQL。对于每个EMPLOYEE,我试图返回他们第一次被放置在最近POSITIONCODE中的DATE。我的表看起来像这样:
| 员工|位置代码|日期|
| --------------|--------------|--------------|
| DAVE|公司简介|2023年1月1日|
| DAVE|公司简介|2019 - 08 - 21 2019 - 08 - 21|
| DAVE|公司简介|2019 - 01 - 12|
| 珍妮|公司简介|2019 - 01 - 15 00:00:00|
| 珍妮|MX124|2022年12月12日|
我期待的结果:
| 员工|位置代码|日期|
| --------------|--------------|--------------|
| DAVE|公司简介|2019 - 08 - 21 2019 - 08 - 21|
| 珍妮|公司简介|2019 - 01 - 15 00:00:00|
我已经尝试了self-joins、group by、min等的某些变体。我不断获取数据行,这些数据行将每个EMPLOYEE和POSITIONCODE组合的最新值分组(这为每个EMPLOYEE返回多个值)。我只需要每个EMPLOYEE一个值。
2条答案
按热度按时间du7egjpx1#
您可以使用
row_number()over()
和min()over()
窗口函数的公共表表达式来实现此结果:查询:
输出:
| 员工|位置代码|日期|
| --------------|--------------|--------------|
| DAVE|公司简介|2022年12月8日|
| 珍妮|公司简介|23年1月15日|
fiddle
kkih6yb82#
在Oracle 12中,您可以使用
MATCH_RECOGNIZE
。这还将检测员工是否已从一个职位切换到另一个职位,然后返回到第一个职位,并将检索该最终职位的最新出现的最早日期:其中,对于样本数据:
输出:
| 员工|位置代码|最早日期|
| --------------|--------------|--------------|
| 爱丽丝|公司简介|2019 -01- 23 00:00:00|
| DAVE|公司简介|2019 -08 -12 00:00:00|
| 珍妮|公司简介|2019 -01-15 00:00:00|
在早期版本中,您可以使用
ROW_NUMBER
解析函数的多重比较:fiddle