数据库--SQLServer--如何找到包含某列最大值的那一行
有这样的表mytable,包括user_id,my_value,my_date三列。我想获取每个user_id的最近日期max(my_date)对应的user_id,my_value,my_date。用怎样的SQL实现呢?这里假设每个user_id下日期唯一。本题来源stackoverflow本题可以有多种方式实现。1.使用分析函数max,找出每个user_id分组的m
有这样的表mytable,包括user_id,my_value,my_date三列。我想获取每个user_id的最近日期max(my_date)对应的user_id,my_value,my_date。用怎样的SQL实现呢?这里假设每个user_id下日期唯一。
本题来源stackoverflow
1.使用分析函数max,找出每个user_id分组的max(my_date)。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
select user_id,
my_value,
my_date
from
(
select user_id,
my_value,
my_date,
max (my_date) over (partition by user_id) max_my_date
from mytable
)
where my_date = max_my_date
|
2.使用分析函数row_number,根据user_id分组后按照my_date排序,取每组第一个。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
select user_id,
my_value,
my_date
from
(
select user_id,
my_value,
my_date,
row_number() over (partition by user_id order by my_date desc ) num
from mytable
)
where num = 1
|
3.使用group by和子查询
|
1
2
3
4
5
6
7
8
9
10
11
12
|
select A.user_id,
A.my_value,
A.my_date
from mytable A,
(
select user_id,
max (my_date) as max_my_date
from mytable
group by user_id
) B
where A.user_id = B.user_id
and A.my_date = B.max_my_date
|
4.自关联加左关联
|
1
2
3
4
5
6
|
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON t1.User_Id = t2.User_Id
AND t1.my_date < t2.my_date
WHERE t2.User_Id IS NULL ;
|
这个方法很别致,深入理解其含义对理解关联操作很有帮助。它的where条件是找出没有满足做关联条件的记录。而左关联的条件是自关联找出自身user_id下日期大于自己的记录。不满足此条件则表明该记录没有日期大于自己的记录,那就是最大日期了。
其实类似的方法还有很多,以上列出具有代表性的方式而已,供学习参考。
文章来自:http://www.sqlparty.com/%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E5%8C%85%E5%90%AB%E6%9F%90%E5%88%97%E6%9C%80%E5%A4%A7%E5%80%BC%E7%9A%84%E9%82%A3%E4%B8%80%E8%A1%8C%EF%BC%9F/
更多推荐
所有评论(0)