SQL选择学生登录

SQL选择学生登录,sql,oracle,Sql,Oracle,我有一个表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 此外,还有一个STUDENT_登录表,其中包含有关学生所有登录的数据

我有一个表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
此外,还有一个STUDENT_登录表,其中包含有关学生所有登录的数据

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
你能帮我写这个吗?

选择上次登录,上次登录,一个月前,S\U L.TIME,S\U L.TIME,一个月前
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())
从学生上次登录S\U L\L 内部连接学生登录S_L on S_L_L.id=S_L.id 其中S_L_L.date
您需要这样编写查询。

选择上次登录、上次登录、一个月前、S\u L.TIME、S\u L.TIME\u一个月前
从学生上次登录S\U L\L
内部连接学生登录S_L on S_L_L.id=S_L.id
其中S_L_L.date

您需要这样编写查询。

您需要使用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

您需要按如下方式使用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

我只能推测你想要最近一次登录,然后是之前一个日历月的最近一次登录。我建议有条件地汇总:

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;

我想这会返回您指定的值。

我只能推测您想要最近一次登录,然后是之前日历月的最近一次登录。我建议有条件地汇总:

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;

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

无需使用两个表。仅使用
STUDENT\u LOGIN
即可。请定义“上次登录一个月前”。无需使用两个表。仅使用
学生登录即可。请定义“上次登录一个月前”。