sql选择学生登录

dz6r00yl  于 2021-08-13  发布在  Java
关注(0)|答案(3)|浏览(243)

我有一个表student\u last\u login,其中包含了关于学生上次登录的数据。

ID  STUDENT_ID   DATE               TIME
1    A          2020-02-01 12:00    15 MIN
2    B          2020-02-02 12:00    45 MIN
3    C          2020-02-03 12:00    25 MIN

此外,还有学生登录表,其中包含有关学生所有登录的数据。

ID  STUDENT_ID   DATE               TIME
1    A          2020-02-01 12:00    15 MIN
4    A          2020-01-01 14:00    33 MIN
2    B          2020-02-02 12:00    45 MIN
5    B          2020-01-02 13:30    47 MIN
10   B          2020-01-03 13:30    27 MIN
6    B          2020-01-02 10:00    44 MIN
3    C          2020-02-03 12:00    25 MIN
7    C          2020-01-03 10:00    12 MIN
8    C          2020-01-03 18:00    56 MIN
9    C          2020-01-04 12:00    88 MIN

因此,我需要得到这样的东西:

STUDENT_ID    LAST_LOGIN         LAST_LOGIN_ONE_MONTH_AGO    TIME     TIME_ONE_MONTH_AGO
A            2020-02-01 12:00    2020-01-01 14:00            15 min   33 min
B            2020-02-02 12:00    2020-01-02 13:30            15 min   47 min
C            2020-02-03 12:00    2020-01-03 18:00            25 min   56 min

你能帮我写这个吗?

6rqinv9w

6rqinv9w1#

SELECT LAST_LOGIN, LAST_LOGIN_ONE_MONTH_AGO, S_L.TIME, S_L.TIME_ONE_MONTH_AGO
FROM STUDENT_LAST_LOGIN S_L_L
INNER JOIN STUDENT_LOGIN S_L on S_L_L.id = S_L.id
where S_L_L.date <  DATEADD(month, -1, GETDATE())

你需要这样写你的查询。

xvw2m8pv

xvw2m8pv2#

您需要按如下方式使用windows函数:

SELECT * FROM
(SELECT SLL.STUDENT_ID, 
        SLL.DATE LAST_LOGIN,
        SL.DATE LAST_LOGIN_ONE_MONTHE_AGO, 
        SLL.TIME,
        SL.TIME TIME_ONE_MONTH_AGO,
        ROW_NUMBER() OVER (PARTITION BY SLL.STUDENT_ID ORDER BY SL.DATE DESC NULLS LAST) AS RN 
   FROM STUDENT_LAST_LOGIN SLL LEFT JOIN STUDENT_LOGIN SL
     ON SL.STUDENT_ID = SLL.STUDENT_ID
    AND TRUNC(SL.DATE) = ADD_MONTHS(TRUNC(SLL.DATE),-1)
)
WHERE RN = 1
8ljdwjyq

8ljdwjyq3#

我只能推测,你想要的是最近的登录,然后是前一个日历月的最新登录。我建议条件聚合:

select sll.student_id,
       max(case when month_seqnum = 1 then last_login end),
       max(case when month_seqnum = 2 then last_login end),
       max(case when month_seqnum = 1 then time end),
       max(case when month_seqnum = 2 then time end)
from (select sll.*,
             row_number() over (partition by student_id, to_char(date, 'YYYY-MM')
                                order by date desc
                               ) as seqnum,
             dense_rank() over (partition by student_id order by to_char(date, 'YYYY-MM')) as month_seqnum
      from student_last_login sll
     ) sll
where month_seqnum in (1, 2) and seqnum = 1
group by student_id;

我认为这会返回您指定的值。

相关问题