gpt4 book ai didi

mysql - 如何在sql中检索表中两列最大值的值

转载 作者:行者123 更新时间:2023-11-29 01:48:43 25 4
gpt4 key购买 nike

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

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

最佳答案

使用解析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),那么您可以将排名合并为一个,甚至可以在 order by 中仅使用一个日期。

关于mysql - 如何在sql中检索表中两列最大值的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56657156/

25 4 0
文章推荐: mysql - SQL : a set of results inside each result
文章推荐: Android-Overlay/Draw Over Everything
文章推荐: android - 使用 ProGuard 优化会承担哪些风险?
文章推荐: mysql - 是否可以在 MySql 触发器中将表名派生为 "NEW."?