如何在SQL中两列的最大值检索表的值

时间:2019-06-18 21:15:42

标签: mysql hive hql impala

我试图通过从两个不同的日期列中获取最大值来查询表,并输出具有两个日期中最大值的所有记录

该表有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的最新记录。

2 个答案:

答案 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