条件的旗帜

时间:2016-11-18 09:42:38

标签: sql vertica

这是我的表:

key date
a   2002
a   2014
a   2011
b   2004
b   2016
b   2001

我想要一个SELECT语句,为最近的日期添加一个标志,如:

key date flag
a   2002 0
a   2014 1
a   2011 0
b   2004 0
b   2016 1
b   2001 0

由于

3 个答案:

答案 0 :(得分:2)

如果您不想进行分组或自我加入,则可以使用analytical function。如果你愿意的话,你可以稍微整理一下,但是我发现使用with将它拆分出来会让事情变得更加明显。

with max_date_query as (
    select key, date, max(date) over (partition by key) max_date
    from mytable
)
select key, date, case when date = max_date then 1 else 0 end flag
from max_date_query

在同一主题上还有其他变体,您可以按date desc订购该窗口,并使用row_number()代替max()来确定该标记。我想我展示的那个更好,但不确定它会有多大影响。如果您遇到重复的最大日期并且只需要选择一个日期,则可能需要使用该方法。

答案 1 :(得分:0)

select t1.*, case when t2.a is null 
                  then 0
                  else 1  
             end as flag
from your_table t1
left join 
(
   select key, max(date) as mdate
   from your_table
   group by key
) t2 on t1.key = t2.key and t1.date = t2.mdate

答案 2 :(得分:0)

不确定“最近”状况是什么(最后“X”年?)并且假设“2015”实际上是DATE值(不是char),请尝试:

select 
t1.key,
t1.date,
CASE WHEN DATEDIFF('year', t1.date, CURRENT_DATE) < 2 THEN 1 ELSE 0 END as flag
from table t1;

如果“日期”实际上是一个整数:

select 
t1.key,
t1.date,
CASE WHEN EXTRACT(YEAR FROM CURRENT_DATE) - t1.date < 2 THEN 1 ELSE 0 END as flag
from table t1;

希望它有所帮助 塞尔吉奥