【问题标题】:Pulling different rows based on age in select query在选择查询中根据年龄提取不同的行
【发布时间】:2021-10-22 04:16:44
【问题描述】:

上下文

我正在使用 Oracle SQL,并且拥有如下所示的数据。人们每年都会被问到他们最喜欢的电影是什么,并且每年都会更新。

Person        Date_of_Birth        Favorite_Movie      Update_Date
Bob             08-10-1950            Endgame             2021-01-01
Bob             08-10-1950            Batman              2020-01-01
Peter           11-01-1990            Toy Story           2021-01-01
Peter           11-01-1990            Mulan               2020-01-01

问题

我想编写一个查询,以便:

if DOB >= 70 then pull the Favorite Movie from the year they turned 70.
else: extract movie from most current year 

所以对于彼得和鲍勃来说,期望的结果如下所示:

Person            DOB            Favorite_Movie      Update_Date
Bob             08-10-1950            Batman              2020-01-01
Peter           11-01-1990            Toy Story           2021-01-01

当前代码

我当前的查询如下所示:

SELECT *,
CASE 
WHEN trunc(months_between(sysdate,Date_Of_Birth)/12) >= 70 THEN

【问题讨论】:

    标签: sql oracle date if-statement case


    【解决方案1】:

    一种方法使用相关子查询:

    select f.*
    from favorites f
    where f.update_date = (select max(f2.update_date)
                           from favorites f2
                           where f2.person = f.person and
                                 f2.date_of_birth >= add_months(f.update_date, - 12 * 70)
                          );
    

    【讨论】:

    • 这个子查询不会在最大值之前包含所有参与者吗?我不能在这里使用 SELECT MAX 因为有更多的数据行具有不同的更新日期(比如说一直到 2000 年)......例如)有人在 2010 年满 70 岁
    • @Yahtzee 。 . .我对你的评论感到困惑。是的,这包括在 70 岁生日当天或之前有排的每个人。每个人只能在结果集中出现一次,最新的一行在他们 70 岁生日当天或之前。
    【解决方案2】:

    如果您按年龄排序行(当 70 岁具有“最高”排名时)然后更新日期(以便最近一年排在“顶部”),那么这可能是一种选择:

    SQL> select person, dob, favorite_movie, update_date
      2  from (select t.*,
      3        row_number() over
      4          (partition by person
      5           order by case when extract(year from update_date) - extract (year from dob) = 70 then 1 else 2 end,
      6                    update_date desc) rn
      7        from test t
      8       )
      9  where rn = 1;
    
    PERSO DOB        FAVORITE_ UPDATE_DAT
    ----- ---------- --------- ----------
    Bob   1950-10-08 Batman    2020-01-01
    Peter 1990-01-11 Toy Story 2021-01-01
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2018-06-07
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多