Вернуть запись с самой ранней датой

Я использую Aginity Workbench с базой данных на Netezza и я пытаюсь вернуть запись с самой ранней датой на основе IS код в любом из трех столбцов (исправность). Есть несколько записей для одного ICS_UID, но я просто хочу вернуть запись, где самое раннее появление этого IS код.

Ниже приведен код, который я пытался использовать, но, похоже, он возвращает все случаи, когда запись имеет IS код, а не выбор ICS_UIDв предложении where. Благодарен за любую помощь или совет.

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;
Другие вопросы по тегам