Один из способов, который по меньшей мере легко читается и переносим, является:
select
STAT.WORKNUM,
STATUS,
CHANGE_DATE,
DATEDIFF(day, APPROVED_DATE, CHANGE_DATE) as TIME_TAKEN
from STAT
join (
select WORKNUM, CHANGE_DATE as APPROVED_DATE
from STAT
where STATUS = 'APPROVED'
) APPROVED_DATES on APPROVED_DATES.WORKNUM = STAT.WORKNUM
Подзапрос возвращает (что неудивительно, учитывая его псевдоним) все утвержденные даты.Каждая строка соединяется с этим, чтобы можно было рассчитать разницу.
Хотя существуют более эффективные способы извлечения данных (с использованием оконных функций), также важны удобочитаемость и переносимость.Этот запрос понятен и, следовательно, обслуживаем, и (в отличие от оконных функций SQL Server) будет работать практически со всеми базами данных, особенно с поддельными, поэтому вы можете выполнить его модульное тестирование без фактической базы данных.