Выберите только одну группу с самой последней датой входа - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь просто получить 1 группу с максимальной датой входа.

user_ID    Group       Login_Date
Mulan      Flower        4/4/2017
Mulan      Badminton   11/20/2015
Mulan      Flower      11/20/2015

Мой код

select distinct group from table t
where t.user_ID = 'Mulan'
and t.Login_Date = (select max (t2.Login_Date)
                      from table t2
                      where t.user_ID = t2.user_ID
                        and t2.Login_date <= sysdate)

Результат

Flower
Badminton

Желаемый выход

Flower

Несмотря на то, что есть 2 Цвета, я хочу убедиться, что я получаю Цветок с самой последней датой Login_Date, то есть 4/4/2017, и что вывод должен возвращать только 1 значение.

Ответы [ 4 ]

1 голос
/ 20 марта 2019
-- Oracle: first/last functions
with s (user_ID, grp, Login_Date) as (
select 'Mulan', 'Flower'   , to_date('4/4/2017'  , 'mm/dd/yyyy') from dual union all
select 'Mulan', 'Badminton', to_date('11/20/2015', 'mm/dd/yyyy') from dual union all
select 'Mulan', 'Flower'   , to_date('11/20/2015', 'mm/dd/yyyy') from dual)
select
user_id,
max(grp) keep (dense_rank last order by login_date) as grp,
max(login_date) as log_date
from s
group by user_id;

USER_ GRP       LOG_DATE
----- --------- -------------------
Mulan Flower    2017-04-04 00:00:00

Ответ на дополнительный вопрос:

with s (user_ID, grp, Login_Date) as (
select 'Mulan', 'Flower'   , to_date('4/4/2017'  , 'mm/dd/yyyy') from dual union all
select 'Mulan', 'Badminton', to_date('11/20/2015', 'mm/dd/yyyy') from dual union all
select 'Mulan', 'Flower'   , to_date('11/20/2015', 'mm/dd/yyyy') from dual)
select
max(grp) keep (dense_rank last order by login_date) as grp
from s
group by user_id;

GRP
---------
Flower
0 голосов
/ 20 марта 2019

Это должно быть простое решение

  select  top 1 max(login_date),login_group  from tableName group by login_group  order 
  by COUNT(user_id) desc
0 голосов
/ 20 марта 2019

Пожалуйста, попробуйте это.И ваша системная дата может вернуться к текущей дате.

select distinct top 1 group from table t
where t.user_ID = 'Mulan'
and t.Login_Date = (select max (t2.Login_Date)
                      from table t2
                      where t.user_ID = t2.user_ID
                        and t2.Login_date <= sysdate)

ИЛИ

 select distinct top 1 group from table t
    where t.user_ID = 'Mulan'
    and t.Login_Date = (select max (t2.Login_Date)
                          from table t2
                          where t.user_ID = t2.user_ID
                        )
0 голосов
/ 20 марта 2019

просто удалите and t2.Login_date <= sysdate условие

select  group from table t
where t.user_ID = 'Mulan' -- you dont need this if user is only Mulan
and t.Login_Date = (select max (t2.Login_Date)
                      from table t2
                      where t.user_ID = t2.user_ID
                        )

вывод

USER_ID     GRP     LOGIN_DATE
Mulan   Flower  04-APR-17

или используйте row_number ()

  with cte as
  (
  select t.*,row_number()over(partition by user_ID order by Login_Date desc) rn
  from table t
 ) select * from cte where rn=1

вывод

USER_ID     GRP     LOGIN_DATE
Mulan   Flower  04-APR-17

демонстрационная ссылка для обеих версий

...