2

emp_id、firstname、lastname、region_id、status、effective_date などの列を持つ従業員テーブルがあります。

従業員テーブルには、同じ従業員に対して有効日とステータスが異なる複数のエントリを含めることができます。

従業員には、「退職者」と「入社者」の 2 つのステータスがあります。

id     emp_id    firstname     region    status     effective_date  
1       1         James        Asia      Joiner     1-Jan-2012 
2       1         James        UK        Leaver     1-Aug-2012
3       1         James        USA       Joiner     1-Aug-2012
4       1         James        Asia      Leaver     1-May-2012
5       1         James        UK        Joiner     1-May-2012
6       1         James        USA       Leaver     1-Sep-2012

上記の従業員テーブルのデータを使用して、2012 年 1 月 1 日のジェームズの最新のレコードを取得する場合、id = 1 のレコードを取得します。

2012 年 5 月 1 日のジェームズの最新レコードを取得したい場合、id = 5 のレコードを取得します。

2012 年 8 月 1 日のジェームズの最新レコードを取得したい場合、id = 3 のレコードを取得します。

2012 年 9 月 1 日のジェームズの最新レコードを取得したい場合、id = 6 のレコードを取得します。

クエリを正しく実行すると、最新のレコードが得られます

SELECT 
        emp_id, 
        MAX(effective_date) AS latest_effective_date
FROM 
        EMPLOYEE
GROUP BY 
        emp_id

しかし、 firstname 、 region などの他の列を取得するにはどうすればよいですか?

それらをselect句またはgroup by句に入れると、最新のレコードだけでなく、他のレコードも取得します。

4

6 に答える 6

10
SELECT * FROM 
( SELECT  
    e.*,
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC) r
FROM  
    EMPLOYEE  e)
WHERE r = 1;

上記は、個別の emp_id ごとに最大の effective__Date を持つレコードを取得します。

特定の日付のレコードを返すという 2 番目の要件は、次のクエリで満たす必要があります。

(「ステータス ASC」 - 同じ日付に「脱退者」もいる場合、「ジョイナー」ステータスの取得を処理します。)

 SELECT * FROM 
( SELECT  
    e.*,
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC, status ASC) r
FROM  
    EMPLOYEE  e
WHERE effective_date <= '<your desired date>')
WHERE r=1;
于 2012-05-28T15:10:32.607 に答える
2

レコードを制限するために、既に持っているクエリを Employee テーブルに内部結合する必要があります。

SELECT  Emp.*
FROM    Employee Emp
        INNER JOIN
        (   SELECT  Emp_ID, MAX(effective_date) AS latest_effective_date
            FROM    Employee
            GROUP BY Emp_ID
        ) MaxEmp
            ON Emp.Emp_ID = MaxEmp.Emp_ID
            AND Emp.Effective_Date = MaxEmp.latest_effective_date
于 2012-05-28T14:24:51.443 に答える
1

入力したクエリは、前に述べたように ID が 3、5、6 のレコードを返すとは限りません。この場合は次のとおりです。

2       1         James        Asia      Leaver     1-May-2012
3       1         James        UK        Joiner     1-May-2012

effective_date は両方の行で等しく、ID が 3 ではなく 2 のレコードが返される可能性があります。

テーブルに時間を追加するか、effective_date 列に時間を追加してみてください。これにより、特定の日付にユーザーから最新の結果を取得できます。

于 2012-05-28T14:39:17.850 に答える
1

これを試してみてください

SELECT  
  MAX(id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) id,
  MAX(emp_id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) emp_id,
  MAX(firstname) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) firstname,
  MAX(status) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) status,
  MAX(effective_date) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) effective_date
FROM Employee GROUP BY firstname
于 2013-03-13T03:56:39.093 に答える
1

試す:

SELECT *
FROM EMPLOYEE emp
INNER JOIN (SELECT max(id) AS id
        emp_id, 
        MAX(effective_date) AS latest_effective_date
FROM 
        EMPLOYEE
GROUP BY 
        emp_id) AS employee_1 on emp.id = employee_1.id
于 2012-05-28T14:22:26.407 に答える