Установка Oracle :
CREATE TABLE test_results ( work, task, "date", result ) AS
SELECT 1, 'clean', DATE '2018-01-01', 'PASSED' FROM DUAL UNION ALL
SELECT 1, 'brush', DATE '2018-01-01', 'PASSED' FROM DUAL UNION ALL
SELECT 2, 'wash', DATE '2018-01-01', 'PASSED' FROM DUAL UNION ALL -- duplicate with older date
SELECT 2, 'wash', DATE '2018-01-02', 'PASSED' FROM DUAL UNION ALL
SELECT 2, 'clean', DATE '2018-01-02', 'PASSED' FROM DUAL UNION ALL
SELECT 2, 'brush', DATE '2018-01-01', 'PASSED' FROM DUAL UNION ALL -- Not the latest date
SELECT 3, 'xyz', DATE '2018-01-01', 'PASSED' FROM DUAL UNION ALL
SELECT 3, 'ccc', DATE '2018-01-01', 'PASSED' FROM DUAL;
Запрос 1 : Если вы хотите установить самую последнюю date
для каждой пары work
/ task
, тогда:
SELECT work,
task,
MAX( "date" ) AS "date"
FROM TEST_RESULTS
WHERE RESULT ='PASSED'
AND task NOT IN (' ', 'N/A' )
GROUP BY work, task
ORDER BY work, "date" DESC;
Выход :
WORK | TASK | date
---: | :---- | :--------
1 | brush | 01-JAN-18
1 | clean | 01-JAN-18
2 | wash | 02-JAN-18
2 | clean | 02-JAN-18
2 | brush | 01-JAN-18
3 | xyz | 01-JAN-18
3 | ccc | 01-JAN-18
Запрос 2 : если вы хотите, чтобы task
только для последних date
для каждого work
затем:
SELECT work,
task,
"date"
FROM (
SELECT work,
task,
"date",
MAX( "date" ) OVER ( PARTITION BY work ) AS latest_date
FROM TEST_RESULTS
WHERE RESULT ='PASSED'
AND task NOT IN (' ', 'N/A' )
)
WHERE "date" = latest_date
ORDER BY work, task;
Выход :
WORK | TASK | date
---: | :---- | :--------
1 | brush | 01-JAN-18
1 | clean | 01-JAN-18
2 | clean | 02-JAN-18
2 | wash | 02-JAN-18
3 | ccc | 01-JAN-18
3 | xyz | 01-JAN-18
db <> скрипка здесь