Использовать аналитическую функцию rank()
. rank()
назначит 1
всем записям с максимальной датой в разделе st_id
:
SELECT s.st_id, s.fl_vw, s.tr_record
from
(
SELECT A.st_id, A.fl_vw, A.tr_record,
rank() over(partition by st_id order by as_of_dt desc) rnk_as_of_dt,
rank() over(partition by st_id order by ld_dt_ts desc) rnk_ld_dt_tsrnk
FROM db.tablename A
)s
WHERE rnk_as_of_dt=1 ANDrnk=1 rnk_ld_dt_ts=1 --get records with max dates in both columns
Возможно объединить два ранга следующим образом:
SELECT s.st_id, s.fl_vw, s.tr_record
from
(
SELECT A.st_id, A.fl_vw, A.tr_record,
rank() over(partition by st_id order by as_of_dt desc, ld_dt_ts desc) rnk
FROM db.tablename A
)s
WHERE rnk=1 --get records with max dates combination
но это не совсем то же самое, что ваш исходный запрос.
Например, если у вас есть этот набор данных:
st_id, as_of_dt, ld_dt_ts
1 1 2
1 2 1
Тогда этот запрос
SELECT st_id, max(as_of_dt) AS as_of_dt, max(ld_dt_ts) AS ld_dt_ts
From db.tablename
group by st_id
вернет:
st_id, as_of_dt, ld_dt_ts
1 2 2
И окончательное соединение не вернет ни одной строки, потому что ни одна строка с такой комбинацией не существует, а запрос с двумя рангами вместе вернет:
st_id, as_of_dt, ld_dt_ts
1 2 1
Если такой набор данных не может существовать в ваших данных (скажем, ld_dt_ts всегда> = as_of_dt), то вы, возможно, можете объединить ранги в один или даже использовать только одну дату в порядке.