sql—编写一个查询,如果用户在当前年度添加了新雇主,则为其添加一个标志

b0zn9rqh  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(180)
employers table

    column  type
    user_id integer
    year    string 
    employer_ein    string

我们得到了一个名为employers的表,它由用户id、年份和employer ein标签组成。用户可以有多个雇主由不同的ein标签指定。如果每个用户在当前年度添加了新雇主,则编写一个查询来为其添加一个标志。

Example: 

   employer

   user_id    year    employer_ein
   # 34323      2018    A 
   # 34323      2018    B
   # 34323      2018    C
   # 34323      2017    F
   # 34323      2017    A
   # 34323      2017    B

   # 86323      2018    A
   # 86323      2018    B
   # 86323      2018    C
   # 86323      2017    B
   # 
   # 98787      2018    A
   # 98787      2018    B
   # 98787      2018    F
   # 98787      2017    F
   # 98787      2017    B
   # 98787      2017    A
   # 
   # 55559      2018    A
   # 55559      2018    B
   # 55559      2018    C

   # Output
   # user_id    year    new_ein_flag
   # 34323      2018      1
   # 86323      2018      1
   # 98787      2018      0
8ehkhllq

8ehkhllq1#

可以使用窗口函数和聚合来执行此操作:

select user_id, year,
       max(case when min_year = year then 1 else 0 end) as new_ein_flag
from (select t.*,
             min(year) over (partition by user_id, ein) as min_year
      from t
     ) t
where year = 2018
group by user_id, year;

内部查询计算每年的最小值 user_id / ein 一对。外部查询只保留当前年份的行,并计算标志(如果有) ein 它们的最小值为当前年份。
编辑:
如果你必须找出最近一年的情况,只需再次使用窗口函数:

select user_id, year,
       max(case when min_year = year then 1 else 0 end) as new_ein_flag
from (select t.*, max(year) over () as max_year,
             min(year) over (partition by user_id, ein) as min_year
      from t
     ) t
where year = max_year
group by user_id, year;

相关问题