2017-04-25 10 views
1

私はNetezza上のデータベースとAginity Workbenchを使用していると私は3(保守)の列のいずれかで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ごとに1つの行をしたい場合は、ROW_NUMBER()使用することができます:IN(.....) 'IS' の

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

ニース使用し、繰り返された文を短くするために同じことを考えていた – DKSan

+0

ありがとう!私はあなたの2番目の例を使用し、それは完全に動作します!私はSQLのnoobですが、私はグループで間違った道を下っていると思っていました。 – gstatus

関連する問題