如何检索 table 中两列最大值的值 sql

How to retrieve the values of the table for the max value of two columns in sql

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

table有6列,包括st_id(string)(同一id有多个条目),as_of_dt(int)和ld_dt_ts(时间戳)。从这个 table,我试图获得 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

--

预期的结果应该是 return st_id as_of_dt 和 ld_dt_ts 中的最大值,即每个 [=23] 的最新记录=].

使用解析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

将return:

st_id, as_of_dt, ld_dt_ts 
1       2         2

并且最终连接不会 return 任何行,因为不存在具有这种组合的任何行,而具有两个等级组合的查询将 return:

st_id, as_of_dt, ld_dt_ts 
1       2         1

如果您的数据中不存在这样的数据集(例如,ld_dt_ts 总是>=as_of_dt),那么您可以将排名合并为一个,甚至可以在订购。

--我正在使用 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