gpt4 book ai didi

sql - 获取一列中另一列的每个不同值具有最大值的行

转载 作者:行者123 更新时间:2023-12-03 03:54:15 26 4
gpt4 key购买 nike

表:

UserId, Value, Date.

我想获取每个 UserId 的 UserId、最大(日期)值。即,具有最新日期的每个 UserId 的值。

如何在 SQL 中执行此操作? (最好是 Oracle。)

我需要获取所有用户 ID。但对于每个 UserId,只有该用户具有最新日期的行。

最佳答案

我看到很多人使用子查询或其他窗口函数来执行此操作,但我经常按以下方式执行这种不使用子查询的查询。它使用简单的标准 SQL,因此它应该可以在任何品牌的 RDBMS 中工作。

SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON (t1.UserId = t2.UserId AND t1."Date" < t2."Date")
WHERE t2.UserId IS NULL;

换句话说:从 t1 获取行其中不存在具有相同 UserId 的其他行和一个更大的日期。

(我将标识符“日期”放在分隔符中,因为它是 SQL 保留字。)

如果t1."Date" = t2."Date" ,出现加倍。通常表有 auto_inc(seq)键,例如id 。为了避免重复,可以使用以下方法:

SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON t1.UserId = t2.UserId AND ((t1."Date" < t2."Date")
OR (t1."Date" = t2."Date" AND t1.id < t2.id))
WHERE t2.UserId IS NULL;
<小时/>

回复@Farhan 的评论:

这里有更详细的解释:

外部联接尝试联接 t1t2 。默认情况下,t1的所有结果返回,如果 t2 中有匹配项,也被返回。如果 t2 中没有匹配项对于 t1 的给定行,那么查询仍然返回 t1 行,并使用NULL作为所有 t2 的占位符的专栏。这就是外连接的一般工作原理。

此查询的技巧是设计连接的匹配条件,使得 t2必须匹配相同userid ,以及更大date 。这个想法是如果 t2 中存在一行具有更大的 date ,然后是 t1 中的行与不可能相比,它是最伟大的date为此userid 。但是如果没有匹配项——即如果 t2 中不存在行具有更大的datet1 中的行-- 我们知道 t1 中的行是最大的行 date对于给定的userid .

在这些情况下(当没有匹配项时), t2 的列将是NULL -- 甚至是连接条件中指定的列。这就是我们使用WHERE t2.UserId IS NULL的原因,因为我们正在搜索未找到具有更大 date 的行的情况对于给定的userid .

关于sql - 获取一列中另一列的每个不同值具有最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/121387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com