您好我在客户表中有以下数据。
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语句中解决。
提前致谢
答案 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<>();