针对每个员工

时间:2016-02-08 09:41:11

标签: sql oracle greatest-n-per-group

我有两张表asgwork rship

在工作表中,每位员工都有date_start。对于少数员工,date_start是重复的,所以我必须从工作rship表中选择min(date_start)

为此我写了一个查询:

SELECT assignment_name,
  REGEXP_SUBSTR(ASSIGNMENT_NAME, '[0-9]+') PERSON_NUMBER,
  NVL( wrk.date_start,t.effective_start_date) ,
  NVL( WRK.WORKER_TYPE,'E'),
  NVL( WRK.LEGAL_EMPLOYER_NAME, 'N/A')
FROM
  (SELECT apps.assignment_table.*,
    COUNT(*) OVER (PARTITION BY assignment_name, effective_start_date, effective_end_date, effective_latest_change) AS c
  FROM apps.assignment_table
  ) T
LEFT OUTER JOIN
  (SELECT *
  FROM apps.work_table
  WHERE date_start =
    (SELECT MIN(date_start) FROM apps.work_table
    )
  ) wrk
ON regexp_substr(t.assignment_name, '[0-9]+')=wrk.person_number
WHERE C   =1;

但是在上面的查询中我犯了一个错误,就是从apps.work_table中选择select min(date_start),这意味着从整个表中选择min(date_start)。 而不是这个,我应该在内联查询本身中包含regexp_substr(t.assignment_name, '[0-9]+')=wrk.person_number

但现在当我把它包括在内时......它没有用。

1 个答案:

答案 0 :(得分:1)

LEFT OUTER JOIN
  (SELECT *
  FROM apps.work_table
  WHERE date_start =
    (SELECT MIN(date_start) FROM apps.work_table
    )
  ) wrk
ON

除非此人的start_date是整个表格中所有人的最小值(而不仅仅是此人的最短日期),否则上面的代码将找不到与您相匹配的任何行想。

你可能想做的事情是:

LEFT OUTER JOIN
( SELECT *
  FROM   (
    SELECT t.*,
           ROW_NUMBER() OVER ( PARTITION BY person_number ORDER BY date_start ASC ) AS rn
    FROM   apps.work_table t
  )
  WHERE  rn = 1
) wrk
ON