sql - 使用来自多个列 SQL 的数据选择 MAX 日期

标签 sql sql-server date max

我知道这是一个经常被问到的问题,我已经查看了已有的内容,但我相信我的案例有点独特(如果不是,请指出正确的方向)。

我正在尝试查找与当前跨两个表和多个列的用户关联的行的最新出现。

table: statusUpdate
+-------+-----------+-----------+-------------------+
|   id |    name    |   status  |       date_change |
+-------+-----------+-----------+-------------------+
|   1   |   Matt    |       0   |   01-01-2001      |
|   2   |   Jeff    |       1   |   01-01-2001      |
|   3   |   Jeff    |       2   |   01-01-2002      |
|   4   |   Bill    |       2   |   01-01-2001      |
|   5   |   Bill    |       3   |   01-01-2004      |
+-------+-----------+-----------+-------------------+

table: relationship
+-------+-----------+--------------+
|   id  |   userID  |stautsUpdateID|       
+-------+-----------+--------------+
|   1   |   22      |       1      |   
|   2   |   33      |       2      |   
|   3   |   33      |       3      |   
|   4   |   44      |       4      | 
|   5   |   44      |       5      | 
+-------+-----------+--------------+

还有第三个表将 userID 链接到它自己的表,但这些示例表应该足以解决我的问题。

我希望按日期获取最新的状态更改。当前的问题是它会返回状态更改的所有实例。

Current results:
+-------+---------+-----------+-------------------+
|userID |statusID |   status  |       date_change |
+-------+---------+-----------+-------------------+
|   33  |   2     |       1   |   01-01-2001      |
|   33  |   3     |       2   |   01-01-2002      |
|   44  |   4     |       2   |   01-01-2001      |
|   44  |   5     |       3   |   01-01-2004      |
+-------+---------+-----------+-------------------+

Expected results:
+-------+-----------+-----------+-------------------+
|userID |statusID   |   status  |       date_change |
+-------+-----------+-----------+-------------------+
|   33  |   3       |       2   |   01-01-2002      |
|   44  |   5       |       3   |   01-01-2004      |
+-------+-----------+-----------+-------------------+

我希望这一切都有意义,否则请询问更多信息。

重申一下,我只想按日期返回用户状态更改的最新实例。

Sample code of one of my attempts:

select 
st.ID, st.status, st.date_change, r.userID 
from statusUpdate st
inner join Relationship r on st.ID = r.statusUpdateID

inner join (select ID, max(date_change) as recent from statusUpdate
group by ID) as y on r.stausUpdateID = y.ID and st.date_change = 
y.recent

希望有人能指出我正确的方向。

最佳答案

使用row_number() 获取用户的最后一行

select *
from
(
select st.ID, st.status, st.date_change, r.userID,
       rn = row_number() over (partition by r.userID order by st.date_change desc) 
from   statusUpdate st
       inner join Relationship r on st.ID = r.statusUpdateID
) as d
where rn  = 1

关于sql - 使用来自多个列 SQL 的数据选择 MAX 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51767080/

相关文章:

sql-server - 源代码管理中的存储过程/DB 模式

java - 是否有任何java类可以从cron表达式中获取日期

JavaScript 指针和日期

php - 填充数组中缺失的元素

sql - postgresql 生成没有间隙的序列

sql - 使用连接时重复列

sql - MySQL删除后自动递增

sql - 顺序磁盘读取实际上是顺序的吗?

sql-server - while循环在触发器内循环遍历sql中表的所有列

sql - 如何扫描表格的每一行,并根据前一行更新当前行?