简体   繁体   中英

Oracle SQL Return First & Last Value From Different Columns By Partition

I need help with a query that will return a single record per partition in the below dataset. I used the DENSE_RANK to get the order and first/last position within each partition, but the problem is that I need to get a single record for each EMPLOYEE ITEM_ID combination which contains:

  • MIN(START) which is date type with time
  • SUM(DURATION) which is a number type signifying seconds of activity
  • MIN ranked value from INIT_STATUS
  • MAX ranked value from FIN_STATUS

Here is the initial data table, the same data table ordered with rank, and the desired result at the end (see image below):

Also, here is the code used to get the ordered table with rank values:

SELECT T.*,
    DENSE_RANK() OVER (PARTITION BY T.EMPLOYEE, T.ITEM_ID ORDER BY T.START) AS D_RANK
FROM TEST_DATA T
ORDER BY T.EMPLOYEE, T.ITEM_ID, T.START;

之前和之后的数据

Use first/last option to find statuses. The rest is classic aggregation:

select employee, min(start_), sum(duration),
       max(init_status) keep (dense_rank first order by start_),
       max(fin_status)  keep (dense_rank last  order by start_)
  from test_data t
  group by employee, item_id
  order by employee, item_id;

start is a reserved word, so I used start_ for my test.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM