我试图通过从两个不同的日期列中获取最大值来查询表,并输出具有两个日期中最大值的所有记录
该表有6列,其中包括st_id(string)(有多个具有相同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
-
预期结果应返回同时具有as_of_dt和ld_dt_ts最大值的st_id,即每个st_id的最新记录。
答案 0 :(得分:1)
使用解析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),那么您可以将等级组合为一个,甚至仅按顺序使用一个日期。
答案 1 :(得分:1)
-我正在使用row_number()函数-
row_number()超过(PARTITION BY st_id ORDER BY as_of_dt DESC,ld_dt_ts DESC)RN 来自db.tablename s)tmp,其中RN = 1