2017-04-25 1 views
1

Netezza에 데이터베이스와 함께 Aginity Workbench을 사용하고 있으며,이를 기반으로 가장 이른 날짜의 기록을 세 개 (서비스 가능성) 열 중 하나에 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을 사용하지 마십시오. 그런 다음 하나 개의 레코드를 원하는 경우 : 당신이 ICS_UID 당 하나 개의 행을 원하는 경우에

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; 

는, 당신은 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 (.....) 'IS'의 좋은 사용, 반복 또는 문장을 단축하는 똑같은 생각했다 – DKSan

+0

고마워요! 두 번째 예를 사용했는데 완벽하게 작동합니다! 저는 SQL의 멍청한 놈입니다. 그러나 나는 그룹과 함께 잘못된 길로 빠져 나갔다고 생각했습니다. – gstatus