带标志的每年最短日期

时间:2017-08-07 14:26:11

标签: sql teradata

您好我在客户表中有以下数据。

CUST_ID     DATE
ab13563590  6/1/2008
ab13563591  1/1/2008
ab13563592  2/1/2008
ab13563593  8/1/2010
ab13563594  7/1/2010
ab13563595  9/1/2008
ab13563596  4/1/2008
ab13563597  10/1/2008
ab13563598  3/1/2009
ab13563599  5/1/2009

我需要一个计算标志,每年的最短日期为“Y'和' N'其他人。预期数据应该看起来像

CUST_ID       DATE    FLAG
ab13563590  6/1/2008    N
ab13563591  1/1/2008    Y
ab13563592  2/1/2008    N
ab13563593  8/1/2010    N
ab13563594  7/1/2010    Y
ab13563595  9/1/2008    N
ab13563596  4/1/2008    N
ab13563597  10/1/2008   N
ab13563598  3/1/2009    Y
ab13563599  5/1/2009    N

我做的是,我用min(日期)逐年分组,并将数据加载到临时表中并加入到实际表中并写了一个case语句。但我想它可以在一个select语句中解决。

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以使用窗口函数解决此问题:

SELECT cust_id,
    date,
    CASE WHEN date = min(date) OVER (PARTITION BY EXTRACT(YEAR FROM date) ORDER BY date) THEN 'Y' ELSE 'N' END AS Flag
FROM table;

这会将当前行的日期与该年的最小日期进行比较。如果他们是平等的,那么你得到'Y'。

答案 1 :(得分:1)

试试这个:

Map<String, Integer> hm = new HashMap<>();