I have a Oracle SQL query that I’m trying to get the MAX value of t4.workers column along with its corresponding columns in that row, but I only want to see one row for each project along with the max workers and the max date of the row with the max workers.
Example Data:
project | date | vendor | workers |
---|---|---|---|
4012 | 01-JAN-21 | ABC | 6 |
4012 | 26-JAN-21 | ABC | 8 |
4012 | 12-JAN-21 | ABC | 8 |
4010 | 13-FEB-21 | ZZZ | 3 |
4010 | 02-FEB-21 | ZZZ | 5 |
4010 | 25-FEB-21 | ZZZ | 15 |
In the above example the outcome I want to see would be:
project | date | vendor | workers |
---|---|---|---|
4010 | 25-FEB-21 | ZZZ | 15 |
4012 | 26-JAN-21 | ABC | 8 |
Below is my code:
SELECT t1.project, t2.date, t3.vendor, t4.workers FROM t1, t2, t3, t4 WHERE t1 = t2 AND t2 = t4 AND t3 = t4;
Advertisement
Answer
You can use the rank()
window function to assign a rank to each row per project
. To define the order use the number of workers
in descending order. Staring from 1
the rank is the lower the more workers
there are in that row. So all the rows where this rank is 1
are the ones you want.
SELECT project, date, vendor, workers FROM (SELECT project, date, vendor, workers, rank() OVER (PARTITION BY project ORDER BY workers DESC) r FROM elbat) x WHERE r = 1;
Note: This includes ties. If you don’t want ties you can use row_number()
instead of rank but then you’d need a second criteria for the order unless it is OK for you that one random row is picked from the tied ones.