如何检索 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
我正在尝试通过从两个不同的日期列中获取最大值来查询 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