2017-04-25 56 views
1

我使用Aginity WorkbenchNetezza数据库,我试图与特色三(可维护性)列中的任何一个的IS代码基于它的最早日期返回的记录。一个ICS_UID有多个记录,但我只想返回记录,其中最早出现的记录是IS代码。返回录制最早日期

下面是我一直在尝试使用的代码,但它似乎是返回所有记录的IS代码的实例,而不是在where子句中选择ICS_UID的所有实例。感谢任何帮助或建议。

SELECT 
ICS _UID, min(MOVEMENT_DATE) as MOVEMENT_DATE, CURRENT_A_SERVICABILITY_CODE, CURRENT_B_SERVICABILITY_CODE, 
CURRENT_C_SERVICABILITY_CODE 
FROM 
HUB_MOVEMENT 
WHERE 
ICS_UID IN (317517607,317962513,etc,etc…) 
AND CURRENT_A_SERVICABILITY_CODE = 'IS' OR CURRENT_B_SERVICABILITY_CODE = 'IS' OR CURRENT_C_SERVICABILITY_CODE = 'IS' 
GROUP BY 
ICS_UID, CURRENT_A_SERVICABILITY_CODE, 
CURRENT_B_SERVICABILITY_CODE, 
CURRENT_C_SERVICABILITY_CODE; 

回答

1

请勿使用GROUP BY。如果你想要一个记录,则:

SELECT m.* 
FROM HUB_MOVEMENT m 
WHERE ICS_UID IN (317517607,317962513,etc,etc…) AND 
     'IS' IN (CURRENT_A_SERVICABILITY_CODE, CURRENT_B_SERVICABILITY_CODE , CURRENT_C_SERVICABILITY_CODE) 
ORDER BY MOVEMENT_DATE 
LIMIT 1; 

如果你想每ICS_UID一行,那么你可以使用ROW_NUMBER()

SELECT m.* 
FROM (SELECT m.*, 
      ROW_NUMBER() OVER (PARTITION BY ICS_UID ORDER BY MOVEMENT_DATE) as seqnum 
     FROM HUB_MOVEMENT m 
     WHERE ICS_UID IN (317517607,317962513,etc,etc…) AND 
      'IS' IN (CURRENT_A_SERVICABILITY_CODE, CURRENT_B_SERVICABILITY_CODE , CURRENT_C_SERVICABILITY_CODE) 
    ) m 
WHERE seqnum = 1; 
+0

尼斯使用的 '是' IN(.....)正想着同样的事缩短重复或陈述 – DKSan

+0

谢谢!我用你的第二个例子,它完美的作品!我是一个sql noob,但是以为我和团队一起走错了路。 – gstatus