1

这是一个疯狂的问题,但基本上我们需要标记与条件匹配的第一行,而不是其余的,例如,我们有所有用户每日登录的历史记录,但每个月我们都希望显示特定日期之前的登录,例如:

UserId     LoginDate
1          2011-12-31
2          2012-12-31
1          2012-01-01
2          2012-01-02
1          2012-01-02
2          2012-01-03

ETC....

我们想要一个 SQL 查询,它将返回每个月的第一个登录名,结果集中类似于:

UserId     LoginDate     WasFirstLoginOfMonth
1          2011-12-31    0
2          2012-12-31    0
1          2012-01-01    1
2          2012-01-02    1
1          2012-01-02    0
2          2012-01-03    0

ETC....

我知道这似乎是一个疯狂的要求,但我们需要知道哪个登录满足特定的日期条件,但只有一个可以,其余的不能。

有没有什么办法可以做到这一点,而无需对每一行进行缓慢的子选择以查看它是否是第一行?

非常感谢您的帮助。

4

1 回答 1

2

row_number() 功能允许您对数据进行分区和排序。

所以在这个查询中, rn 代表登录的序号,按用户、年份和月份,所以当该值为 时1,即是该月的第一次登录。

select * 
from
(
select *, 
       row_number() over 
       (
            partition by userID, 
            year(logindate),
            month(logindate)
            order by logindate
       ) rn
from yourtable
)  v
where rn = 1
于 2012-11-29T09:50:36.020 回答