Как получить значения таблицы для максимального значения двух столбцов в SQL - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь запросить таблицу, взяв максимальные значения из двух разных столбцов даты, и выведите все записи, которые имеют максимум обеих дат

Таблица имеет 6 столбцов, которые включают st_id (строка) (есть несколько записей с одинаковым идентификатором), as_of_dt (int) и ld_dt_ts (timestamp). Из этой таблицы я пытаюсь получить максимальное значение as_of_dt и ld_dt_ts и сгруппировать по st_id и отобразить все записи.

Это прекрасно работает, но не совсем оптимально

SELECT A.st_id, A.fl_vw, A.tr_record FROM db.tablename A 
INNER JOIN (
    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
) B on A.st_id = B.st_id and A.as_of_dt = B.as_of_dt and A.ld_dt_ts= B.ld_dt_ts

-

Ожидаемый результат должен возвращать st_id с максимальным значением as_of_dt и ld_dt_ts, т.е., который будет самой последней записью для каждого st_id.

Ответы [ 2 ]

1 голос
/ 19 июня 2019

- я использую функцию row_number (), -

row_number () over (PARTITION BY st_id ORDER BY as_of_dt DESC, ld_dt_ts DESC) RN из db.tablename s) tmp, где RN = 1

1 голос
/ 19 июня 2019

Использовать аналитическую функцию 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), то вы, возможно, можете объединить ранги в один или даже использовать только одну дату в порядке.

...